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>
This commit is contained in:
commit
bc6370b622
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user