diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2013-08-26 13:04:39 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2013-08-26 13:07:13 +0200 |
commit | bc6370b622276c5603d6e32e3939f8b7fb3a4b35 (patch) | |
tree | 9635b752bdf2eb6ca6f61a8a129412f61251ef2e | |
parent | f5a0c205d91d049a663f704dda606a5562055efb (diff) | |
parent | a3b53ff062eaccdaa28964899c63520ef2978c2e (diff) | |
download | ffmpeg-bc6370b622276c5603d6e32e3939f8b7fb3a4b35.tar.gz |
Merge commit 'a3b53ff062eaccdaa28964899c63520ef2978c2e'
* commit 'a3b53ff062eaccdaa28964899c63520ef2978c2e':
mov: Refactor video specific parsing in mov_parse_stsd_video
Conflicts:
libavformat/mov.c
Merged-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libavformat/mov.c | 225 |
1 files changed, 113 insertions, 112 deletions
diff --git a/libavformat/mov.c b/libavformat/mov.c index bd43ba8d46..64b48059b2 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -1271,11 +1271,122 @@ 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'); + st->codec->width &= ~1; + st->codec->height &= ~1; + } + /* 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 a, 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++) { + if (st->codec->codec_id == AV_CODEC_ID_CINEPAK){ + r = g = b = color_count - 1 - color_index; + } else + r = g = b = color_index; + sc->palette[j] = (0xFFU << 24) | (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] = (0xFFU << 24) | (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 A, R, G, or B component is 16 bits; + * only use the top 8 bits */ + a = 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] = (a << 24 ) | (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; @@ -1327,118 +1438,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'); - st->codec->width &= ~1; - st->codec->height &= ~1; - } - /* 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 a, 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++) { - if (id == AV_CODEC_ID_CINEPAK){ - r = g = b = color_count - 1 - color_index; - }else - r = g = b = color_index; - sc->palette[j] = - (0xFFU << 24) | (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] = - (0xFFU << 24) | (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 A, R, G, or B component is 16 bits; - * only use the top 8 bits */ - a = 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] = - (a << 24 ) | (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); |