summaryrefslogtreecommitdiff
path: root/libavformat/mov.c
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2014-06-18 20:42:52 +0200
committerAnton Khirnov <anton@khirnov.net>2016-02-23 17:01:58 +0100
commit9200514ad8717c63f82101dc394f4378854325bf (patch)
tree566b8d48565a88303363198acc81de06363daa7a /libavformat/mov.c
parenta8068346e48e123f8d3bdf4d64464d81e53e5fc7 (diff)
lavf: replace AVStream.codec with AVStream.codecpar
Currently, AVStream contains an embedded AVCodecContext instance, which is used by demuxers to export stream parameters to the caller and by muxers to receive stream parameters from the caller. It is also used internally as the codec context that is passed to parsers. In addition, it is also widely used by the callers as the decoding (when demuxer) or encoding (when muxing) context, though this has been officially discouraged since Libav 11. There are multiple important problems with this approach: - the fields in AVCodecContext are in general one of * stream parameters * codec options * codec state However, it's not clear which ones are which. It is consequently unclear which fields are a demuxer allowed to set or a muxer allowed to read. This leads to erratic behaviour depending on whether decoding or encoding is being performed or not (and whether it uses the AVStream embedded codec context). - various synchronization issues arising from the fact that the same context is used by several different APIs (muxers/demuxers, parsers, bitstream filters and encoders/decoders) simultaneously, with there being no clear rules for who can modify what and the different processes being typically delayed with respect to each other. - avformat_find_stream_info() making it necessary to support opening and closing a single codec context multiple times, thus complicating the semantics of freeing various allocated objects in the codec context. Those problems are resolved by replacing the AVStream embedded codec context with a newly added AVCodecParameters instance, which stores only the stream parameters exported by the demuxers or read by the muxers.
Diffstat (limited to 'libavformat/mov.c')
-rw-r--r--libavformat/mov.c356
1 files changed, 182 insertions, 174 deletions
diff --git a/libavformat/mov.c b/libavformat/mov.c
index 2b8ccd28e8..0dee5ec59b 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -214,8 +214,8 @@ static int mov_read_covr(MOVContext *c, AVIOContext *pb, int type, int len)
st->attached_pic.stream_index = st->index;
st->attached_pic.flags |= AV_PKT_FLAG_KEY;
- st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
- st->codec->codec_id = id;
+ st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
+ st->codecpar->codec_id = id;
return 0;
}
@@ -613,13 +613,13 @@ static int mov_read_hdlr(MOVContext *c, AVIOContext *pb, MOVAtom atom)
av_log(c->fc, AV_LOG_TRACE, "stype= %.4s\n", (char*)&type);
if (type == MKTAG('v','i','d','e'))
- st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
+ st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
else if (type == MKTAG('s','o','u','n'))
- st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
+ st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
else if (type == MKTAG('m','1','a',' '))
- st->codec->codec_id = AV_CODEC_ID_MP2;
+ st->codecpar->codec_id = AV_CODEC_ID_MP2;
else if ((type == MKTAG('s','u','b','p')) || (type == MKTAG('c','l','c','p')))
- st->codec->codec_type = AVMEDIA_TYPE_SUBTITLE;
+ st->codecpar->codec_type = AVMEDIA_TYPE_SUBTITLE;
avio_rb32(pb); /* component manufacture */
avio_rb32(pb); /* component flags */
@@ -693,15 +693,19 @@ static int mov_read_dac3(MOVContext *c, AVIOContext *pb, MOVAtom atom)
bsmod = (ac3info >> 14) & 0x7;
acmod = (ac3info >> 11) & 0x7;
lfeon = (ac3info >> 10) & 0x1;
- st->codec->channels = ((int[]){2,1,2,3,3,4,4,5})[acmod] + lfeon;
- st->codec->channel_layout = avpriv_ac3_channel_layout_tab[acmod];
+ st->codecpar->channels = ((int[]){2,1,2,3,3,4,4,5})[acmod] + lfeon;
+ st->codecpar->channel_layout = avpriv_ac3_channel_layout_tab[acmod];
if (lfeon)
- st->codec->channel_layout |= AV_CH_LOW_FREQUENCY;
+ st->codecpar->channel_layout |= AV_CH_LOW_FREQUENCY;
*ast = bsmod;
- if (st->codec->channels > 1 && bsmod == 0x7)
+ if (st->codecpar->channels > 1 && bsmod == 0x7)
*ast = AV_AUDIO_SERVICE_TYPE_KARAOKE;
+#if FF_API_LAVF_AVCTX
+ FF_DISABLE_DEPRECATION_WARNINGS
st->codec->audio_service_type = *ast;
+ FF_ENABLE_DEPRECATION_WARNINGS
+#endif
return 0;
}
@@ -729,15 +733,19 @@ static int mov_read_dec3(MOVContext *c, AVIOContext *pb, MOVAtom atom)
bsmod = (eac3info >> 12) & 0x1f;
acmod = (eac3info >> 9) & 0x7;
lfeon = (eac3info >> 8) & 0x1;
- st->codec->channel_layout = avpriv_ac3_channel_layout_tab[acmod];
+ st->codecpar->channel_layout = avpriv_ac3_channel_layout_tab[acmod];
if (lfeon)
- st->codec->channel_layout |= AV_CH_LOW_FREQUENCY;
- st->codec->channels = av_get_channel_layout_nb_channels(st->codec->channel_layout);
+ st->codecpar->channel_layout |= AV_CH_LOW_FREQUENCY;
+ st->codecpar->channels = av_get_channel_layout_nb_channels(st->codecpar->channel_layout);
*ast = bsmod;
- if (st->codec->channels > 1 && bsmod == 0x7)
+ if (st->codecpar->channels > 1 && bsmod == 0x7)
*ast = AV_AUDIO_SERVICE_TYPE_KARAOKE;
+#if FF_API_LAVF_AVCTX
+ FF_DISABLE_DEPRECATION_WARNINGS
st->codec->audio_service_type = *ast;
+ FF_ENABLE_DEPRECATION_WARNINGS
+#endif
return 0;
}
@@ -769,7 +777,7 @@ static int mov_read_wfex(MOVContext *c, AVIOContext *pb, MOVAtom atom)
return 0;
st = c->fc->streams[c->fc->nb_streams-1];
- return ff_get_wav_header(c->fc, pb, st->codec, atom.size);
+ return ff_get_wav_header(c->fc, pb, st->codecpar, atom.size);
}
static int mov_read_pasp(MOVContext *c, AVIOContext *pb, MOVAtom atom)
@@ -973,18 +981,18 @@ static int mov_read_smi(MOVContext *c, AVIOContext *pb, MOVAtom atom)
// currently SVQ3 decoder expect full STSD header - so let's fake it
// this should be fixed and just SMI header should be passed
- av_free(st->codec->extradata);
- st->codec->extradata = av_mallocz(atom.size + 0x5a + AV_INPUT_BUFFER_PADDING_SIZE);
- if (!st->codec->extradata)
+ av_free(st->codecpar->extradata);
+ st->codecpar->extradata = av_mallocz(atom.size + 0x5a + AV_INPUT_BUFFER_PADDING_SIZE);
+ if (!st->codecpar->extradata)
return AVERROR(ENOMEM);
- st->codec->extradata_size = 0x5a + atom.size;
- memcpy(st->codec->extradata, "SVQ3", 4); // fake
+ st->codecpar->extradata_size = 0x5a + atom.size;
+ memcpy(st->codecpar->extradata, "SVQ3", 4); // fake
- ret = ffio_read_size(pb, st->codec->extradata + 0x5a, atom.size);
+ ret = ffio_read_size(pb, st->codecpar->extradata + 0x5a, atom.size);
if (ret < 0)
return ret;
- av_log(c->fc, AV_LOG_TRACE, "Reading SMI %"PRId64" %s\n", atom.size, st->codec->extradata + 0x5a);
+ av_log(c->fc, AV_LOG_TRACE, "Reading SMI %"PRId64" %s\n", atom.size, st->codecpar->extradata + 0x5a);
return 0;
}
@@ -1000,18 +1008,18 @@ static int mov_read_enda(MOVContext *c, AVIOContext *pb, MOVAtom atom)
little_endian = !!avio_rb16(pb);
av_log(c->fc, AV_LOG_TRACE, "enda %d\n", little_endian);
if (little_endian == 1) {
- switch (st->codec->codec_id) {
+ switch (st->codecpar->codec_id) {
case AV_CODEC_ID_PCM_S24BE:
- st->codec->codec_id = AV_CODEC_ID_PCM_S24LE;
+ st->codecpar->codec_id = AV_CODEC_ID_PCM_S24LE;
break;
case AV_CODEC_ID_PCM_S32BE:
- st->codec->codec_id = AV_CODEC_ID_PCM_S32LE;
+ st->codecpar->codec_id = AV_CODEC_ID_PCM_S32LE;
break;
case AV_CODEC_ID_PCM_F32BE:
- st->codec->codec_id = AV_CODEC_ID_PCM_F32LE;
+ st->codecpar->codec_id = AV_CODEC_ID_PCM_F32LE;
break;
case AV_CODEC_ID_PCM_F64BE:
- st->codec->codec_id = AV_CODEC_ID_PCM_F64LE;
+ st->codecpar->codec_id = AV_CODEC_ID_PCM_F64LE;
break;
default:
break;
@@ -1053,9 +1061,9 @@ static int mov_read_colr(MOVContext *c, AVIOContext *pb, MOVAtom atom)
uint8_t color_range = avio_r8(pb) >> 7;
av_log(c->fc, AV_LOG_TRACE, " full %"PRIu8"", color_range);
if (color_range)
- st->codec->color_range = AVCOL_RANGE_JPEG;
+ st->codecpar->color_range = AVCOL_RANGE_JPEG;
else
- st->codec->color_range = AVCOL_RANGE_MPEG;
+ st->codecpar->color_range = AVCOL_RANGE_MPEG;
/* 14496-12 references JPEG XR specs (rather than the more complete
* 23001-8) so some adjusting is required */
if (color_primaries >= AVCOL_PRI_FILM)
@@ -1066,26 +1074,26 @@ static int mov_read_colr(MOVContext *c, AVIOContext *pb, MOVAtom atom)
color_trc = AVCOL_TRC_UNSPECIFIED;
if (color_matrix >= AVCOL_SPC_BT2020_NCL)
color_matrix = AVCOL_SPC_UNSPECIFIED;
- st->codec->color_primaries = color_primaries;
- st->codec->color_trc = color_trc;
- st->codec->colorspace = color_matrix;
+ st->codecpar->color_primaries = color_primaries;
+ st->codecpar->color_trc = color_trc;
+ st->codecpar->color_space = color_matrix;
} else if (!strncmp(color_parameter_type, "nclc", 4)) {
/* color primaries, Table 4-4 */
switch (color_primaries) {
- case 1: st->codec->color_primaries = AVCOL_PRI_BT709; break;
- case 5: st->codec->color_primaries = AVCOL_PRI_SMPTE170M; break;
- case 6: st->codec->color_primaries = AVCOL_PRI_SMPTE240M; break;
+ case 1: st->codecpar->color_primaries = AVCOL_PRI_BT709; break;
+ case 5: st->codecpar->color_primaries = AVCOL_PRI_SMPTE170M; break;
+ case 6: st->codecpar->color_primaries = AVCOL_PRI_SMPTE240M; break;
}
/* color transfer, Table 4-5 */
switch (color_trc) {
- case 1: st->codec->color_trc = AVCOL_TRC_BT709; break;
- case 7: st->codec->color_trc = AVCOL_TRC_SMPTE240M; break;
+ case 1: st->codecpar->color_trc = AVCOL_TRC_BT709; break;
+ case 7: st->codecpar->color_trc = AVCOL_TRC_SMPTE240M; break;
}
/* color matrix, Table 4-6 */
switch (color_matrix) {
- case 1: st->codec->colorspace = AVCOL_SPC_BT709; break;
- case 6: st->codec->colorspace = AVCOL_SPC_BT470BG; break;
- case 7: st->codec->colorspace = AVCOL_SPC_SMPTE240M; break;
+ case 1: st->codecpar->color_space = AVCOL_SPC_BT709; break;
+ case 6: st->codecpar->color_space = AVCOL_SPC_BT470BG; break;
+ case 7: st->codecpar->color_space = AVCOL_SPC_SMPTE240M; break;
}
}
av_log(c->fc, AV_LOG_TRACE, "\n");
@@ -1122,7 +1130,7 @@ static int mov_read_fiel(MOVContext *c, AVIOContext *pb, MOVAtom atom)
if (decoded_field_order == AV_FIELD_UNKNOWN && mov_field_order) {
av_log(NULL, AV_LOG_ERROR, "Unknown MOV field order 0x%04x\n", mov_field_order);
}
- st->codec->field_order = decoded_field_order;
+ st->codecpar->field_order = decoded_field_order;
return 0;
}
@@ -1138,15 +1146,15 @@ static int mov_read_extradata(MOVContext *c, AVIOContext *pb, MOVAtom atom)
if (c->fc->nb_streams < 1) // will happen with jp2 files
return 0;
st= c->fc->streams[c->fc->nb_streams-1];
- size= (uint64_t)st->codec->extradata_size + atom.size + 8 + AV_INPUT_BUFFER_PADDING_SIZE;
+ size= (uint64_t)st->codecpar->extradata_size + atom.size + 8 + AV_INPUT_BUFFER_PADDING_SIZE;
if (size > INT_MAX || (uint64_t)atom.size > INT_MAX)
return AVERROR_INVALIDDATA;
- if ((err = av_reallocp(&st->codec->extradata, size)) < 0) {
- st->codec->extradata_size = 0;
+ if ((err = av_reallocp(&st->codecpar->extradata, size)) < 0) {
+ st->codecpar->extradata_size = 0;
return err;
}
- buf = st->codec->extradata + st->codec->extradata_size;
- st->codec->extradata_size= size - AV_INPUT_BUFFER_PADDING_SIZE;
+ buf = st->codecpar->extradata + st->codecpar->extradata_size;
+ st->codecpar->extradata_size= size - AV_INPUT_BUFFER_PADDING_SIZE;
AV_WB32( buf , atom.size + 8);
AV_WL32( buf + 4, atom.type);
@@ -1169,15 +1177,15 @@ static int mov_read_wave(MOVContext *c, AVIOContext *pb, MOVAtom atom)
if ((uint64_t)atom.size > (1<<30))
return AVERROR_INVALIDDATA;
- if (st->codec->codec_id == AV_CODEC_ID_QDM2 || st->codec->codec_id == AV_CODEC_ID_QDMC) {
+ if (st->codecpar->codec_id == AV_CODEC_ID_QDM2 || st->codecpar->codec_id == AV_CODEC_ID_QDMC) {
// pass all frma atom to codec, needed at least for QDMC and QDM2
- av_free(st->codec->extradata);
- st->codec->extradata = av_mallocz(atom.size + AV_INPUT_BUFFER_PADDING_SIZE);
- if (!st->codec->extradata)
+ av_free(st->codecpar->extradata);
+ st->codecpar->extradata = av_mallocz(atom.size + AV_INPUT_BUFFER_PADDING_SIZE);
+ if (!st->codecpar->extradata)
return AVERROR(ENOMEM);
- st->codec->extradata_size = atom.size;
+ st->codecpar->extradata_size = atom.size;
- ret = ffio_read_size(pb, st->codec->extradata, atom.size);
+ ret = ffio_read_size(pb, st->codecpar->extradata, atom.size);
if (ret < 0)
return ret;
} else if (atom.size > 8) { /* to read frma, esds atoms */
@@ -1213,13 +1221,13 @@ static int mov_read_glbl(MOVContext *c, AVIOContext *pb, MOVAtom atom)
if (type == MKTAG('f','i','e','l') && size == atom.size)
return mov_read_default(c, pb, atom);
}
- av_free(st->codec->extradata);
- st->codec->extradata = av_mallocz(atom.size + AV_INPUT_BUFFER_PADDING_SIZE);
- if (!st->codec->extradata)
+ av_free(st->codecpar->extradata);
+ st->codecpar->extradata = av_mallocz(atom.size + AV_INPUT_BUFFER_PADDING_SIZE);
+ if (!st->codecpar->extradata)
return AVERROR(ENOMEM);
- st->codec->extradata_size = atom.size;
+ st->codecpar->extradata_size = atom.size;
- ret = ffio_read_size(pb, st->codec->extradata, atom.size);
+ ret = ffio_read_size(pb, st->codecpar->extradata, atom.size);
if (ret < 0)
return ret;
@@ -1243,14 +1251,14 @@ static int mov_read_dvc1(MOVContext *c, AVIOContext *pb, MOVAtom atom)
if ((profile_level & 0xf0) != 0xc0)
return 0;
- av_free(st->codec->extradata);
- st->codec->extradata = av_mallocz(atom.size - 7 + AV_INPUT_BUFFER_PADDING_SIZE);
- if (!st->codec->extradata)
+ av_free(st->codecpar->extradata);
+ st->codecpar->extradata = av_mallocz(atom.size - 7 + AV_INPUT_BUFFER_PADDING_SIZE);
+ if (!st->codecpar->extradata)
return AVERROR(ENOMEM);
- st->codec->extradata_size = atom.size - 7;
+ st->codecpar->extradata_size = atom.size - 7;
avio_seek(pb, 6, SEEK_CUR);
- ret = ffio_read_size(pb, st->codec->extradata, st->codec->extradata_size);
+ ret = ffio_read_size(pb, st->codecpar->extradata, st->codecpar->extradata_size);
if (ret < 0)
return ret;
@@ -1276,14 +1284,14 @@ static int mov_read_strf(MOVContext *c, AVIOContext *pb, MOVAtom atom)
if ((uint64_t)atom.size > (1<<30))
return AVERROR_INVALIDDATA;
- av_free(st->codec->extradata);
- st->codec->extradata = av_mallocz(atom.size - 40 + AV_INPUT_BUFFER_PADDING_SIZE);
- if (!st->codec->extradata)
+ av_free(st->codecpar->extradata);
+ st->codecpar->extradata = av_mallocz(atom.size - 40 + AV_INPUT_BUFFER_PADDING_SIZE);
+ if (!st->codecpar->extradata)
return AVERROR(ENOMEM);
- st->codec->extradata_size = atom.size - 40;
+ st->codecpar->extradata_size = atom.size - 40;
avio_skip(pb, 40);
- ret = ffio_read_size(pb, st->codec->extradata, atom.size - 40);
+ ret = ffio_read_size(pb, st->codecpar->extradata, atom.size - 40);
if (ret < 0)
return ret;
@@ -1356,24 +1364,24 @@ static int mov_codec_id(AVStream *st, uint32_t format)
(format & 0xFFFF) == 'T' + ('S' << 8)))
id = ff_codec_get_id(ff_codec_wav_tags, av_bswap32(format) & 0xFFFF);
- if (st->codec->codec_type != AVMEDIA_TYPE_VIDEO && id > 0) {
- st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
- } else if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO &&
+ if (st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO && id > 0) {
+ st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
+ } else if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO &&
/* skip old asf mpeg4 tag */
format && format != MKTAG('m','p','4','s')) {
id = ff_codec_get_id(ff_codec_movvideo_tags, format);
if (id <= 0)
id = ff_codec_get_id(ff_codec_bmp_tags, format);
if (id > 0)
- st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
- else if (st->codec->codec_type == AVMEDIA_TYPE_DATA) {
+ st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
+ else if (st->codecpar->codec_type == AVMEDIA_TYPE_DATA) {
id = ff_codec_get_id(ff_codec_movsubtitle_tags, format);
if (id > 0)
- st->codec->codec_type = AVMEDIA_TYPE_SUBTITLE;
+ st->codecpar->codec_type = AVMEDIA_TYPE_SUBTITLE;
}
}
- st->codec->codec_tag = format;
+ st->codecpar->codec_tag = format;
return id;
}
@@ -1392,8 +1400,8 @@ static void mov_parse_stsd_video(MOVContext *c, AVIOContext *pb,
avio_rb32(pb); /* temporal quality */
avio_rb32(pb); /* spatial quality */
- st->codec->width = avio_rb16(pb); /* width */
- st->codec->height = avio_rb16(pb); /* height */
+ st->codecpar->width = avio_rb16(pb); /* width */
+ st->codecpar->height = avio_rb16(pb); /* height */
avio_rb32(pb); /* horiz resolution */
avio_rb32(pb); /* vert resolution */
@@ -1412,19 +1420,19 @@ static void mov_parse_stsd_video(MOVContext *c, AVIOContext *pb,
/* codec_tag YV12 triggers an UV swap in rawdec.c */
if (!memcmp(codec_name, "Planar Y'CbCr 8-bit 4:2:0", 25))
- st->codec->codec_tag = MKTAG('I', '4', '2', '0');
+ st->codecpar->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') &&
+ if (st->codecpar->codec_tag == MKTAG('H','2','6','3') &&
!memcmp(codec_name, "Sorenson H263", 13))
- st->codec->codec_id = AV_CODEC_ID_FLV1;
+ st->codecpar->codec_id = AV_CODEC_ID_FLV1;
- st->codec->bits_per_coded_sample = avio_rb16(pb); /* depth */
+ st->codecpar->bits_per_coded_sample = avio_rb16(pb); /* depth */
color_table_id = avio_rb16(pb); /* colortable id */
av_log(c->fc, AV_LOG_TRACE, "depth %d, ctab id %d\n",
- st->codec->bits_per_coded_sample, color_table_id);
+ st->codecpar->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;
+ color_depth = st->codecpar->bits_per_coded_sample & 0x1F;
+ color_greyscale = st->codecpar->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)) {
@@ -1435,7 +1443,7 @@ static void mov_parse_stsd_video(MOVContext *c, AVIOContext *pb,
if (color_greyscale) {
int color_index, color_dec;
/* compute the greyscale palette */
- st->codec->bits_per_coded_sample = color_depth;
+ st->codecpar->bits_per_coded_sample = color_depth;
color_count = 1 << color_depth;
color_index = 255;
color_dec = 256 / (color_count - 1);
@@ -1498,14 +1506,14 @@ static void mov_parse_stsd_audio(MOVContext *c, AVIOContext *pb,
avio_rb16(pb); /* revision level */
avio_rb32(pb); /* vendor */
- st->codec->channels = avio_rb16(pb); /* channel count */
- st->codec->bits_per_coded_sample = avio_rb16(pb); /* sample size */
- av_log(c->fc, AV_LOG_TRACE, "audio channels %d\n", st->codec->channels);
+ st->codecpar->channels = avio_rb16(pb); /* channel count */
+ st->codecpar->bits_per_coded_sample = avio_rb16(pb); /* sample size */
+ av_log(c->fc, AV_LOG_TRACE, "audio channels %d\n", st->codecpar->channels);
sc->audio_cid = avio_rb16(pb);
avio_rb16(pb); /* packet size = 0 */
- st->codec->sample_rate = ((avio_rb32(pb) >> 16));
+ st->codecpar->sample_rate = ((avio_rb32(pb) >> 16));
// Read QT version 1 fields. In version 0 these do not exist.
av_log(c->fc, AV_LOG_TRACE, "version =%d, isom =%d\n", version, c->isom);
@@ -1517,22 +1525,22 @@ static void mov_parse_stsd_audio(MOVContext *c, AVIOContext *pb,
avio_rb32(pb); /* bytes per sample */
} else if (version == 2) {
avio_rb32(pb); /* sizeof struct only */
- st->codec->sample_rate = av_int2double(avio_rb64(pb));
- st->codec->channels = avio_rb32(pb);
+ st->codecpar->sample_rate = av_int2double(avio_rb64(pb));
+ st->codecpar->channels = avio_rb32(pb);
avio_rb32(pb); /* always 0x7F000000 */
- st->codec->bits_per_coded_sample = avio_rb32(pb);
+ st->codecpar->bits_per_coded_sample = avio_rb32(pb);
flags = avio_rb32(pb); /* lpcm format specific flag */
sc->bytes_per_frame = avio_rb32(pb);
sc->samples_per_frame = avio_rb32(pb);
- if (st->codec->codec_tag == MKTAG('l','p','c','m'))
- st->codec->codec_id =
- ff_mov_get_lpcm_codec_id(st->codec->bits_per_coded_sample,
+ if (st->codecpar->codec_tag == MKTAG('l','p','c','m'))
+ st->codecpar->codec_id =
+ ff_mov_get_lpcm_codec_id(st->codecpar->bits_per_coded_sample,
flags);
}
if (version == 0 || (version == 1 && sc->audio_cid != -2)) {
/* can't correctly handle variable sized packet as audio unit */
- switch (st->codec->codec_id) {
+ switch (st->codecpar->codec_id) {
case AV_CODEC_ID_MP2:
case AV_CODEC_ID_MP3:
st->need_parsing = AVSTREAM_PARSE_FULL;
@@ -1541,33 +1549,33 @@ static void mov_parse_stsd_audio(MOVContext *c, AVIOContext *pb,
}
}
- switch (st->codec->codec_id) {
+ switch (st->codecpar->codec_id) {
case AV_CODEC_ID_PCM_S8:
case AV_CODEC_ID_PCM_U8:
- if (st->codec->bits_per_coded_sample == 16)
- st->codec->codec_id = AV_CODEC_ID_PCM_S16BE;
+ if (st->codecpar->bits_per_coded_sample == 16)
+ st->codecpar->codec_id = AV_CODEC_ID_PCM_S16BE;
break;
case AV_CODEC_ID_PCM_S16LE:
case AV_CODEC_ID_PCM_S16BE:
- if (st->codec->bits_per_coded_sample == 8)
- st->codec->codec_id = AV_CODEC_ID_PCM_S8;
- else if (st->codec->bits_per_coded_sample == 24)
- st->codec->codec_id =
- st->codec->codec_id == AV_CODEC_ID_PCM_S16BE ?
+ if (st->codecpar->bits_per_coded_sample == 8)
+ st->codecpar->codec_id = AV_CODEC_ID_PCM_S8;
+ else if (st->codecpar->bits_per_coded_sample == 24)
+ st->codecpar->codec_id =
+ st->codecpar->codec_id == AV_CODEC_ID_PCM_S16BE ?
AV_CODEC_ID_PCM_S24BE : AV_CODEC_ID_PCM_S24LE;
break;
/* set values for old format before stsd version 1 appeared */
case AV_CODEC_ID_MACE3:
sc->samples_per_frame = 6;
- sc->bytes_per_frame = 2 * st->codec->channels;
+ sc->bytes_per_frame = 2 * st->codecpar->channels;
break;
case AV_CODEC_ID_MACE6:
sc->samples_per_frame = 6;
- sc->bytes_per_frame = 1 * st->codec->channels;
+ sc->bytes_per_frame = 1 * st->codecpar->channels;
break;
case AV_CODEC_ID_ADPCM_IMA_QT:
sc->samples_per_frame = 64;
- sc->bytes_per_frame = 34 * st->codec->channels;
+ sc->bytes_per_frame = 34 * st->codecpar->channels;
break;
case AV_CODEC_ID_GSM:
sc->samples_per_frame = 160;
@@ -1577,10 +1585,10 @@ static void mov_parse_stsd_audio(MOVContext *c, AVIOContext *pb,
break;
}
- bits_per_sample = av_get_bits_per_sample(st->codec->codec_id);
+ bits_per_sample = av_get_bits_per_sample(st->codecpar->codec_id);
if (bits_per_sample) {
- st->codec->bits_per_coded_sample = bits_per_sample;
- sc->sample_size = (bits_per_sample >> 3) * st->codec->channels;
+ st->codecpar->bits_per_coded_sample = bits_per_sample;
+ sc->sample_size = (bits_per_sample >> 3) * st->codecpar->channels;
}
}
@@ -1592,10 +1600,10 @@ static void mov_parse_stsd_subtitle(MOVContext *c, AVIOContext *pb,
// color, fonts, and default styles, so fake an atom to read it
MOVAtom fake_atom = { .size = size };
// mp4s contains a regular esds atom
- if (st->codec->codec_tag != AV_RL32("mp4s"))
+ if (st->codecpar->codec_tag != AV_RL32("mp4s"))
mov_read_glbl(c, pb, fake_atom);
- st->codec->width = sc->width;
- st->codec->height = sc->height;
+ st->codecpar->width = sc->width;
+ st->codecpar->height = sc->height;
}
static uint32_t yuv_to_rgba(uint32_t ycbcr)
@@ -1617,15 +1625,15 @@ static uint32_t yuv_to_rgba(uint32_t ycbcr)
static int mov_rewrite_dvd_sub_extradata(AVStream *st)
{
char buf[256] = {0};
- uint8_t *src = st->codec->extradata;
+ uint8_t *src = st->codecpar->extradata;
int i;
- if (st->codec->extradata_size != 64)
+ if (st->codecpar->extradata_size != 64)
return 0;
- if (st->codec->width > 0 && st->codec->height > 0)
+ if (st->codecpar->width > 0 && st->codecpar->height > 0)
snprintf(buf, sizeof(buf), "size: %dx%d\n",
- st->codec->width, st->codec->height);
+ st->codecpar->width, st->codecpar->height);
av_strlcat(buf, "palette: ", sizeof(buf));
for (i = 0; i < 16; i++) {
@@ -1638,13 +1646,13 @@ static int mov_rewrite_dvd_sub_extradata(AVStream *st)
if (av_strlcat(buf, "\n", sizeof(buf)) >= sizeof(buf))
return 0;
- av_freep(&st->codec->extradata);
- st->codec->extradata_size = 0;
- st->codec->extradata = av_mallocz(strlen(buf) + AV_INPUT_BUFFER_PADDING_SIZE);
- if (!st->codec->extradata)
+ av_freep(&st->codecpar->extradata);
+ st->codecpar->extradata_size = 0;
+ st->codecpar->extradata = av_mallocz(strlen(buf) + AV_INPUT_BUFFER_PADDING_SIZE);
+ if (!st->codecpar->extradata)
return AVERROR(ENOMEM);
- st->codec->extradata_size = strlen(buf);
- memcpy(st->codec->extradata, buf, st->codec->extradata_size);
+ st->codecpar->extradata_size = strlen(buf);
+ memcpy(st->codecpar->extradata, buf, st->codecpar->extradata_size);
return 0;
}
@@ -1655,12 +1663,12 @@ static int mov_parse_stsd_data(MOVContext *c, AVIOContext *pb,
{
int ret;
- if (st->codec->codec_tag == MKTAG('t','m','c','d')) {
- st->codec->extradata_size = size;
- st->codec->extradata = av_malloc(size + AV_INPUT_BUFFER_PADDING_SIZE);
- if (!st->codec->extradata)
+ if (st->codecpar->codec_tag == MKTAG('t','m','c','d')) {
+ st->codecpar->extradata_size = size;
+ st->codecpar->extradata = av_malloc(size + AV_INPUT_BUFFER_PADDING_SIZE);
+ if (!st->codecpar->extradata)
return AVERROR(ENOMEM);
- ret = ffio_read_size(pb, st->codec->extradata, size);
+ ret = ffio_read_size(pb, st->codecpar->extradata, size);
if (ret < 0)
return ret;
} else {
@@ -1673,12 +1681,12 @@ static int mov_parse_stsd_data(MOVContext *c, AVIOContext *pb,
static int mov_finalize_stsd_codec(MOVContext *c, AVIOContext *pb,
AVStream *st, MOVStreamContext *sc)
{
- if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
- !st->codec->sample_rate && sc->time_scale > 1)
- st->codec->sample_rate = sc->time_scale;
+ if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
+ !st->codecpar->sample_rate && sc->time_scale > 1)
+ st->codecpar->sample_rate = sc->time_scale;
/* special codec parameters handling */
- switch (st->codec->codec_id) {
+ switch (st->codecpar->codec_id) {
#if CONFIG_DV_DEMUXER
case AV_CODEC_ID_DVAUDIO:
c->dv_fctx = avformat_alloc_context();
@@ -1692,40 +1700,40 @@ static int mov_finalize_stsd_codec(MOVContext *c, AVIOContext *pb,
return AVERROR(ENOMEM);
}
sc->dv_audio_container = 1;
- st->codec->codec_id = AV_CODEC_ID_PCM_S16LE;
+ st->codecpar->codec_id = AV_CODEC_ID_PCM_S16LE;
break;
#endif
/* no ifdef since parameters are always those */
case AV_CODEC_ID_QCELP:
- st->codec->channels = 1;
+ st->codecpar->channels = 1;
// force sample rate for qcelp when not stored in mov
- if (st->codec->codec_tag != MKTAG('Q','c','l','p'))
- st->codec->sample_rate = 8000;
+ if (st->codecpar->codec_tag != MKTAG('Q','c','l','p'))
+ st->codecpar->sample_rate = 8000;
break;
case AV_CODEC_ID_AMR_NB:
- st->codec->channels = 1;
+ st->codecpar->channels = 1;
/* force sample rate for amr, stsd in 3gp does not store sample rate */
- st->codec->sample_rate = 8000;
+ st->codecpar->sample_rate = 8000;
break;
case AV_CODEC_ID_AMR_WB:
- st->codec->channels = 1;
- st->codec->sample_rate = 16000;
+ st->codecpar->channels = 1;
+ st->codecpar->sample_rate = 16000;
break;
case AV_CODEC_ID_MP2:
case AV_CODEC_ID_MP3:
/* force type after stsd for m1a hdlr */
- st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
+ st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
break;
case AV_CODEC_ID_GSM:
case AV_CODEC_ID_ADPCM_MS:
case AV_CODEC_ID_ADPCM_IMA_WAV:
case AV_CODEC_ID_ILBC:
- st->codec->block_align = sc->bytes_per_frame;
+ st->codecpar->block_align = sc->bytes_per_frame;
break;
case AV_CODEC_ID_ALAC:
- if (st->codec->extradata_size == 36) {
- st->codec->channels = AV_RB8 (st->codec->extradata + 21);
- st->codec->sample_rate = AV_RB32(st->codec->extradata + 32);
+ if (st->codecpar->extradata_size == 36) {
+ st->codecpar->channels = AV_RB8 (st->codecpar->extradata + 21);
+ st->codecpar->sample_rate = AV_RB32(st->codecpar->extradata + 32);
}
break;
case AV_CODEC_ID_VC1:
@@ -1794,27 +1802,27 @@ int ff_mov_read_stsd_entries(MOVContext *c, AVIOContext *pb, int entries)
return AVERROR_INVALIDDATA;
}
- if (mov_skip_multiple_stsd(c, pb, st->codec->codec_tag, format,
+ if (mov_skip_multiple_stsd(c, pb, st->codecpar->codec_tag, format,
size - (avio_tell(pb) - start_pos)))
continue;
- sc->pseudo_stream_id = st->codec->codec_tag ? -1 : pseudo_stream_id;
+ sc->pseudo_stream_id = st->codecpar->codec_tag ? -1 : pseudo_stream_id;
sc->dref_id= dref_id;
id = mov_codec_id(st, format);
av_log(c->fc, AV_LOG_TRACE,
"size=%"PRId64" format=0x%08x codec_type=%d\n",
- size, format, st->codec->codec_type);
+ size, format, st->codecpar->codec_type);
- if (st->codec->codec_type==AVMEDIA_TYPE_VIDEO) {
- st->codec->codec_id = id;
+ if (st->codecpar->codec_type==AVMEDIA_TYPE_VIDEO) {
+ st->codecpar->codec_id = id;
mov_parse_stsd_video(c, pb, st, sc);
- } else if (st->codec->codec_type==AVMEDIA_TYPE_AUDIO) {
- st->codec->codec_id = id;
+ } else if (st->codecpar->codec_type==AVMEDIA_TYPE_AUDIO) {
+ st->codecpar->codec_id = id;
mov_parse_stsd_audio(c, pb, st, sc);
- } else if (st->codec->codec_type==AVMEDIA_TYPE_SUBTITLE){
- st->codec->codec_id = id;
+ } else if (st->codecpar->codec_type==AVMEDIA_TYPE_SUBTITLE){
+ st->codecpar->codec_id = id;
mov_parse_stsd_subtitle(c, pb, st, sc,
size - (avio_tell(pb) - start_pos));
} else {
@@ -2216,12 +2224,12 @@ static void mov_build_index(MOVContext *mov, AVStream *st)
/* more than 16 frames delay, dts are likely wrong
this happens with files created by iMovie */
sc->wrong_dts = 1;
- st->codec->has_b_frames = 1;
+ st->internal->avctx->has_b_frames = 1;
}
}
/* only use old uncompressed audio chunk demuxing when stts specifies it */
- if (!(st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
+ if (!(st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
sc->stts_count == 1 && sc->stts_data[0].duration == 1)) {
unsigned int current_sample = 0;
unsigned int stts_sample = 0;
@@ -2304,7 +2312,7 @@ static void mov_build_index(MOVContext *mov, AVStream *st)
}
}
if (st->duration > 0)
- st->codec->bit_rate = stream_size*8*sc->time_scale/st->duration;
+ st->codecpar->bit_rate = stream_size*8*sc->time_scale/st->duration;
} else {
unsigned chunk_samples, total = 0;
@@ -2458,7 +2466,7 @@ static int mov_read_trak(MOVContext *c, AVIOContext *pb, MOVAtom atom)
if (!sc) return AVERROR(ENOMEM);
st->priv_data = sc;
- st->codec->codec_type = AVMEDIA_TYPE_DATA;
+ st->codecpar->codec_type = AVMEDIA_TYPE_DATA;
sc->ffindex = st->index;
if ((ret = mov_read_default(c, pb, atom)) < 0)
@@ -2504,23 +2512,23 @@ static int mov_read_trak(MOVContext *c, AVIOContext *pb, MOVAtom atom)
} else
sc->pb = c->fc->pb;
- if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
+ if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
if (!st->sample_aspect_ratio.num &&
- (st->codec->width != sc->width || st->codec->height != sc->height)) {
- st->sample_aspect_ratio = av_d2q(((double)st->codec->height * sc->width) /
- ((double)st->codec->width * sc->height), INT_MAX);
+ (st->codecpar->width != sc->width || st->codecpar->height != sc->height)) {
+ st->sample_aspect_ratio = av_d2q(((double)st->codecpar->height * sc->width) /
+ ((double)st->codecpar->width * sc->height), INT_MAX);
}
}
// done for ai5q, ai52, ai55, ai1q, ai12 and ai15.
- if (!st->codec->extradata_size && st->codec->codec_id == AV_CODEC_ID_H264 &&
- TAG_IS_AVCI(st->codec->codec_tag)) {
+ if (!st->codecpar->extradata_size && st->codecpar->codec_id == AV_CODEC_ID_H264 &&
+ TAG_IS_AVCI(st->codecpar->codec_tag)) {
ret = ff_generate_avci_extradata(st);
if (ret < 0)
return ret;
}
- switch (st->codec->codec_id) {
+ switch (st->codecpar->codec_id) {
#if CONFIG_H261_DECODER
case AV_CODEC_ID_H261:
#endif
@@ -2530,8 +2538,8 @@ static int mov_read_trak(MOVContext *c, AVIOContext *pb, MOVAtom atom)
#if CONFIG_MPEG4_DECODER
case AV_CODEC_ID_MPEG4:
#endif
- st->codec->width = 0; /* let decoder init width/height */
- st->codec->height= 0;
+ st->codecpar->width = 0; /* let decoder init width/height */
+ st->codecpar->height= 0;
break;
case AV_CODEC_ID_MP3:
st->need_parsing = AVSTREAM_PARSE_FULL;
@@ -2923,7 +2931,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
sc->ctts_data[sc->ctts_count].duration = (flags & MOV_TRUN_SAMPLE_CTS) ?
avio_rb32(pb) : 0;
sc->ctts_count++;
- if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
+ if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
keyframe = 1;
else
keyframe =
@@ -3396,12 +3404,12 @@ static int mov_read_header(AVFormatContext *s)
AVStream *st = s->streams[i];
MOVStreamContext *sc = st->priv_data;
- if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
- if (st->codec->width <= 0 || st->codec->height <= 0) {
- st->codec->width = sc->width;
- st->codec->height = sc->height;
+ if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) {
+ if (st->codecpar->width <= 0 || st->codecpar->height <= 0) {
+ st->codecpar->width = sc->width;
+ st->codecpar->height = sc->height;
}
- if (st->codec->codec_id == AV_CODEC_ID_DVD_SUBTITLE) {
+ if (st->codecpar->codec_id == AV_CODEC_ID_DVD_SUBTITLE) {
if ((err = mov_rewrite_dvd_sub_extradata(st)) < 0)
return err;
}
@@ -3413,7 +3421,7 @@ static int mov_read_header(AVFormatContext *s)
AVStream *st = s->streams[i];
MOVStreamContext *sc = st->priv_data;
if (st->duration > 0)
- st->codec->bit_rate = sc->data_size * 8 * sc->time_scale / st->duration;
+ st->codecpar->bit_rate = sc->data_size * 8 * sc->time_scale / st->duration;
}
}
@@ -3421,7 +3429,7 @@ static int mov_read_header(AVFormatContext *s)
AVStream *st = s->streams[i];
MOVStreamContext *sc = st->priv_data;
- switch (st->codec->codec_type) {
+ switch (st->codecpar->codec_type) {
case AVMEDIA_TYPE_AUDIO:
err = ff_replaygain_export(st, s->metadata);
if (err < 0) {