From a3b53ff062eaccdaa28964899c63520ef2978c2e Mon Sep 17 00:00:00 2001 From: Luca Barbato Date: Thu, 22 Aug 2013 15:05:27 +0200 Subject: [PATCH] mov: Refactor video specific parsing in mov_parse_stsd_video --- libavformat/mov.c | 215 +++++++++++++++++++++++----------------------- 1 file changed, 108 insertions(+), 107 deletions(-) diff --git a/libavformat/mov.c b/libavformat/mov.c index 16dab92448..0c3f988ae4 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -1100,11 +1100,117 @@ static int mov_codec_id(AVStream *st, uint32_t format) return id; } +static void mov_parse_stsd_video(MOVContext *c, AVIOContext *pb, + AVStream *st, MOVStreamContext *sc) +{ + unsigned int color_depth, len, j; + int color_greyscale; + int color_table_id; + + avio_rb16(pb); /* version */ + avio_rb16(pb); /* revision level */ + avio_rb32(pb); /* vendor */ + avio_rb32(pb); /* temporal quality */ + avio_rb32(pb); /* spatial quality */ + + st->codec->width = avio_rb16(pb); /* width */ + st->codec->height = avio_rb16(pb); /* height */ + + avio_rb32(pb); /* horiz resolution */ + avio_rb32(pb); /* vert resolution */ + avio_rb32(pb); /* data size, always 0 */ + avio_rb16(pb); /* frames per samples */ + + len = avio_r8(pb); /* codec name, pascal string */ + if (len > 31) + len = 31; + mov_read_mac_string(c, pb, len, st->codec->codec_name, 32); + if (len < 31) + avio_skip(pb, 31 - len); + /* codec_tag YV12 triggers an UV swap in rawdec.c */ + if (!memcmp(st->codec->codec_name, "Planar Y'CbCr 8-bit 4:2:0", 25)) + st->codec->codec_tag = MKTAG('I', '4', '2', '0'); + /* Flash Media Server uses tag H263 with Sorenson Spark */ + if (st->codec->codec_tag == MKTAG('H','2','6','3') && + !memcmp(st->codec->codec_name, "Sorenson H263", 13)) + st->codec->codec_id = AV_CODEC_ID_FLV1; + + st->codec->bits_per_coded_sample = avio_rb16(pb); /* depth */ + color_table_id = avio_rb16(pb); /* colortable id */ + av_dlog(c->fc, "depth %d, ctab id %d\n", + st->codec->bits_per_coded_sample, color_table_id); + /* figure out the palette situation */ + color_depth = st->codec->bits_per_coded_sample & 0x1F; + color_greyscale = st->codec->bits_per_coded_sample & 0x20; + + /* if the depth is 2, 4, or 8 bpp, file is palettized */ + if ((color_depth == 2) || (color_depth == 4) || (color_depth == 8)) { + /* for palette traversal */ + unsigned int color_start, color_count, color_end; + unsigned char r, g, b; + + if (color_greyscale) { + int color_index, color_dec; + /* compute the greyscale palette */ + st->codec->bits_per_coded_sample = color_depth; + color_count = 1 << color_depth; + color_index = 255; + color_dec = 256 / (color_count - 1); + for (j = 0; j < color_count; j++) { + r = g = b = color_index; + sc->palette[j] = (r << 16) | (g << 8) | (b); + color_index -= color_dec; + if (color_index < 0) + color_index = 0; + } + } else if (color_table_id) { + const uint8_t *color_table; + /* if flag bit 3 is set, use the default palette */ + color_count = 1 << color_depth; + if (color_depth == 2) + color_table = ff_qt_default_palette_4; + else if (color_depth == 4) + color_table = ff_qt_default_palette_16; + else + color_table = ff_qt_default_palette_256; + + for (j = 0; j < color_count; j++) { + r = color_table[j * 3 + 0]; + g = color_table[j * 3 + 1]; + b = color_table[j * 3 + 2]; + sc->palette[j] = (r << 16) | (g << 8) | (b); + } + } else { + /* load the palette from the file */ + color_start = avio_rb32(pb); + color_count = avio_rb16(pb); + color_end = avio_rb16(pb); + if ((color_start <= 255) && (color_end <= 255)) { + for (j = color_start; j <= color_end; j++) { + /* each R, G, or B component is 16 bits; + * only use the top 8 bits; skip alpha bytes + * up front */ + avio_r8(pb); + avio_r8(pb); + r = avio_r8(pb); + avio_r8(pb); + g = avio_r8(pb); + avio_r8(pb); + b = avio_r8(pb); + avio_r8(pb); + sc->palette[j] = (r << 16) | (g << 8) | (b); + } + } + } + sc->has_palette = 1; + } +} + int ff_mov_read_stsd_entries(MOVContext *c, AVIOContext *pb, int entries) { AVStream *st; MOVStreamContext *sc; - int j, pseudo_stream_id; + int pseudo_stream_id; if (c->fc->nb_streams < 1) return 0; @@ -1157,113 +1263,8 @@ int ff_mov_read_stsd_entries(MOVContext *c, AVIOContext *pb, int entries) (format >> 24) & 0xff, st->codec->codec_type); if (st->codec->codec_type==AVMEDIA_TYPE_VIDEO) { - unsigned int color_depth, len; - int color_greyscale; - int color_table_id; - st->codec->codec_id = id; - avio_rb16(pb); /* version */ - avio_rb16(pb); /* revision level */ - avio_rb32(pb); /* vendor */ - avio_rb32(pb); /* temporal quality */ - avio_rb32(pb); /* spatial quality */ - - st->codec->width = avio_rb16(pb); /* width */ - st->codec->height = avio_rb16(pb); /* height */ - - avio_rb32(pb); /* horiz resolution */ - avio_rb32(pb); /* vert resolution */ - avio_rb32(pb); /* data size, always 0 */ - avio_rb16(pb); /* frames per samples */ - - len = avio_r8(pb); /* codec name, pascal string */ - if (len > 31) - len = 31; - mov_read_mac_string(c, pb, len, st->codec->codec_name, 32); - if (len < 31) - avio_skip(pb, 31 - len); - /* codec_tag YV12 triggers an UV swap in rawdec.c */ - if (!memcmp(st->codec->codec_name, "Planar Y'CbCr 8-bit 4:2:0", 25)) - st->codec->codec_tag=MKTAG('I', '4', '2', '0'); - /* Flash Media Server uses tag H263 with Sorenson Spark */ - if (format == MKTAG('H','2','6','3') && - !memcmp(st->codec->codec_name, "Sorenson H263", 13)) - st->codec->codec_id = AV_CODEC_ID_FLV1; - - st->codec->bits_per_coded_sample = avio_rb16(pb); /* depth */ - color_table_id = avio_rb16(pb); /* colortable id */ - av_dlog(c->fc, "depth %d, ctab id %d\n", - st->codec->bits_per_coded_sample, color_table_id); - /* figure out the palette situation */ - color_depth = st->codec->bits_per_coded_sample & 0x1F; - color_greyscale = st->codec->bits_per_coded_sample & 0x20; - - /* if the depth is 2, 4, or 8 bpp, file is palettized */ - if ((color_depth == 2) || (color_depth == 4) || - (color_depth == 8)) { - /* for palette traversal */ - unsigned int color_start, color_count, color_end; - unsigned char r, g, b; - - if (color_greyscale) { - int color_index, color_dec; - /* compute the greyscale palette */ - st->codec->bits_per_coded_sample = color_depth; - color_count = 1 << color_depth; - color_index = 255; - color_dec = 256 / (color_count - 1); - for (j = 0; j < color_count; j++) { - r = g = b = color_index; - sc->palette[j] = - (r << 16) | (g << 8) | (b); - color_index -= color_dec; - if (color_index < 0) - color_index = 0; - } - } else if (color_table_id) { - const uint8_t *color_table; - /* if flag bit 3 is set, use the default palette */ - color_count = 1 << color_depth; - if (color_depth == 2) - color_table = ff_qt_default_palette_4; - else if (color_depth == 4) - color_table = ff_qt_default_palette_16; - else - color_table = ff_qt_default_palette_256; - - for (j = 0; j < color_count; j++) { - r = color_table[j * 3 + 0]; - g = color_table[j * 3 + 1]; - b = color_table[j * 3 + 2]; - sc->palette[j] = - (r << 16) | (g << 8) | (b); - } - } else { - /* load the palette from the file */ - color_start = avio_rb32(pb); - color_count = avio_rb16(pb); - color_end = avio_rb16(pb); - if ((color_start <= 255) && - (color_end <= 255)) { - for (j = color_start; j <= color_end; j++) { - /* each R, G, or B component is 16 bits; - * only use the top 8 bits; skip alpha bytes - * up front */ - avio_r8(pb); - avio_r8(pb); - r = avio_r8(pb); - avio_r8(pb); - g = avio_r8(pb); - avio_r8(pb); - b = avio_r8(pb); - avio_r8(pb); - sc->palette[j] = - (r << 16) | (g << 8) | (b); - } - } - } - sc->has_palette = 1; - } + mov_parse_stsd_video(c, pb, st, sc); } else if (st->codec->codec_type==AVMEDIA_TYPE_AUDIO) { int bits_per_sample, flags; uint16_t version = avio_rb16(pb); -- GitLab