Commit 955b818c authored by Clément Bœsch's avatar Clément Bœsch

ffmpeg: switch to codecpar

This commit is largely based on commit 15e84ed3 from Anton Khirnov
<anton@khirnov.net> which was previously skipped in bbf5ef9d.

There are still a bunch of things raising codecpar related warnings that
need fixing, such as:
- the use of codec->debug in the interactive debug mode
- read_ffserver_streams(): it's probably broken now but there is no test
- lowres stuff
- codec copy apparently required by bitstream filters

The matroska references are updated because they now properly forward
the field_order (previously unknown, now progressive).

Thanks to James Almer for fixing a bunch of FATE issues in this commit.
Signed-off-by: 's avatarClément Bœsch <clement@stupeflix.com>
Signed-off-by: 's avatarJames Almer <jamrial@gmail.com>
parent 187c4273
...@@ -1993,7 +1993,7 @@ AVDictionary *filter_codec_opts(AVDictionary *opts, enum AVCodecID codec_id, ...@@ -1993,7 +1993,7 @@ AVDictionary *filter_codec_opts(AVDictionary *opts, enum AVCodecID codec_id,
codec = s->oformat ? avcodec_find_encoder(codec_id) codec = s->oformat ? avcodec_find_encoder(codec_id)
: avcodec_find_decoder(codec_id); : avcodec_find_decoder(codec_id);
switch (st->codec->codec_type) { switch (st->codecpar->codec_type) {
case AVMEDIA_TYPE_VIDEO: case AVMEDIA_TYPE_VIDEO:
prefix = 'v'; prefix = 'v';
flags |= AV_OPT_FLAG_VIDEO_PARAM; flags |= AV_OPT_FLAG_VIDEO_PARAM;
...@@ -2051,7 +2051,7 @@ AVDictionary **setup_find_stream_info_opts(AVFormatContext *s, ...@@ -2051,7 +2051,7 @@ AVDictionary **setup_find_stream_info_opts(AVFormatContext *s,
return NULL; return NULL;
} }
for (i = 0; i < s->nb_streams; i++) for (i = 0; i < s->nb_streams; i++)
opts[i] = filter_codec_opts(codec_opts, s->streams[i]->codec->codec_id, opts[i] = filter_codec_opts(codec_opts, s->streams[i]->codecpar->codec_id,
s, s->streams[i], NULL); s, s->streams[i], NULL);
return opts; return opts;
} }
......
This diff is collapsed.
...@@ -418,6 +418,7 @@ typedef struct OutputStream { ...@@ -418,6 +418,7 @@ typedef struct OutputStream {
int64_t last_mux_dts; int64_t last_mux_dts;
AVBitStreamFilterContext *bitstream_filters; AVBitStreamFilterContext *bitstream_filters;
AVCodecContext *enc_ctx; AVCodecContext *enc_ctx;
AVCodecParameters *ref_par; /* associated input codec parameters with encoders options applied */
AVCodec *enc; AVCodec *enc;
int64_t max_frames; int64_t max_frames;
AVFrame *filtered_frame; AVFrame *filtered_frame;
......
...@@ -94,19 +94,19 @@ void choose_sample_fmt(AVStream *st, AVCodec *codec) ...@@ -94,19 +94,19 @@ void choose_sample_fmt(AVStream *st, AVCodec *codec)
if (codec && codec->sample_fmts) { if (codec && codec->sample_fmts) {
const enum AVSampleFormat *p = codec->sample_fmts; const enum AVSampleFormat *p = codec->sample_fmts;
for (; *p != -1; p++) { for (; *p != -1; p++) {
if (*p == st->codec->sample_fmt) if (*p == st->codecpar->format)
break; break;
} }
if (*p == -1) { if (*p == -1) {
if((codec->capabilities & AV_CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0])) if((codec->capabilities & AV_CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codecpar->format) > av_get_sample_fmt_name(codec->sample_fmts[0]))
av_log(NULL, AV_LOG_ERROR, "Conversion will not be lossless.\n"); av_log(NULL, AV_LOG_ERROR, "Conversion will not be lossless.\n");
if(av_get_sample_fmt_name(st->codec->sample_fmt)) if(av_get_sample_fmt_name(st->codecpar->format))
av_log(NULL, AV_LOG_WARNING, av_log(NULL, AV_LOG_WARNING,
"Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n", "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
av_get_sample_fmt_name(st->codec->sample_fmt), av_get_sample_fmt_name(st->codecpar->format),
codec->name, codec->name,
av_get_sample_fmt_name(codec->sample_fmts[0])); av_get_sample_fmt_name(codec->sample_fmts[0]));
st->codec->sample_fmt = codec->sample_fmts[0]; st->codecpar->format = codec->sample_fmts[0];
} }
} }
} }
...@@ -251,7 +251,7 @@ static void init_input_filter(FilterGraph *fg, AVFilterInOut *in) ...@@ -251,7 +251,7 @@ static void init_input_filter(FilterGraph *fg, AVFilterInOut *in)
s = input_files[file_idx]->ctx; s = input_files[file_idx]->ctx;
for (i = 0; i < s->nb_streams; i++) { for (i = 0; i < s->nb_streams; i++) {
enum AVMediaType stream_type = s->streams[i]->codec->codec_type; enum AVMediaType stream_type = s->streams[i]->codecpar->codec_type;
if (stream_type != type && if (stream_type != type &&
!(stream_type == AVMEDIA_TYPE_SUBTITLE && !(stream_type == AVMEDIA_TYPE_SUBTITLE &&
type == AVMEDIA_TYPE_VIDEO /* sub2video hack */)) type == AVMEDIA_TYPE_VIDEO /* sub2video hack */))
...@@ -611,7 +611,7 @@ static int configure_output_audio_filter(FilterGraph *fg, OutputFilter *ofilter, ...@@ -611,7 +611,7 @@ static int configure_output_audio_filter(FilterGraph *fg, OutputFilter *ofilter,
int i; int i;
for (i=0; i<of->ctx->nb_streams; i++) for (i=0; i<of->ctx->nb_streams; i++)
if (of->ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) if (of->ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
break; break;
if (i<of->ctx->nb_streams) { if (i<of->ctx->nb_streams) {
...@@ -673,15 +673,15 @@ static int sub2video_prepare(InputStream *ist) ...@@ -673,15 +673,15 @@ static int sub2video_prepare(InputStream *ist)
int i, w, h; int i, w, h;
/* Compute the size of the canvas for the subtitles stream. /* Compute the size of the canvas for the subtitles stream.
If the subtitles codec has set a size, use it. Otherwise use the If the subtitles codecpar has set a size, use it. Otherwise use the
maximum dimensions of the video streams in the same file. */ maximum dimensions of the video streams in the same file. */
w = ist->dec_ctx->width; w = ist->dec_ctx->width;
h = ist->dec_ctx->height; h = ist->dec_ctx->height;
if (!(w && h)) { if (!(w && h)) {
for (i = 0; i < avf->nb_streams; i++) { for (i = 0; i < avf->nb_streams; i++) {
if (avf->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) { if (avf->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
w = FFMAX(w, avf->streams[i]->codec->width); w = FFMAX(w, avf->streams[i]->codecpar->width);
h = FFMAX(h, avf->streams[i]->codec->height); h = FFMAX(h, avf->streams[i]->codecpar->height);
} }
} }
if (!(w && h)) { if (!(w && h)) {
...@@ -1081,7 +1081,7 @@ int configure_filtergraph(FilterGraph *fg) ...@@ -1081,7 +1081,7 @@ int configure_filtergraph(FilterGraph *fg)
/* identical to the same check in ffmpeg.c, needed because /* identical to the same check in ffmpeg.c, needed because
complex filter graphs are initialized earlier */ complex filter graphs are initialized earlier */
av_log(NULL, AV_LOG_ERROR, "Encoder (codec %s) not found for output stream #%d:%d\n", av_log(NULL, AV_LOG_ERROR, "Encoder (codec %s) not found for output stream #%d:%d\n",
avcodec_get_name(ost->st->codec->codec_id), ost->file_index, ost->index); avcodec_get_name(ost->st->codecpar->codec_id), ost->file_index, ost->index);
return AVERROR(EINVAL); return AVERROR(EINVAL);
} }
if (ost->enc->type == AVMEDIA_TYPE_AUDIO && if (ost->enc->type == AVMEDIA_TYPE_AUDIO &&
......
This diff is collapsed.
...@@ -5339,7 +5339,7 @@ int avformat_transfer_internal_stream_timing_info(const AVOutputFormat *ofmt, ...@@ -5339,7 +5339,7 @@ int avformat_transfer_internal_stream_timing_info(const AVOutputFormat *ofmt,
} }
} }
if (enc_ctx->codec_tag == AV_RL32("tmcd") if ((enc_ctx->codec_tag == AV_RL32("tmcd") || ost->codecpar->codec_tag == AV_RL32("tmcd"))
&& dec_ctx->time_base.num < dec_ctx->time_base.den && dec_ctx->time_base.num < dec_ctx->time_base.den
&& dec_ctx->time_base.num > 0 && dec_ctx->time_base.num > 0
&& 121LL*dec_ctx->time_base.num > dec_ctx->time_base.den) { && 121LL*dec_ctx->time_base.num > dec_ctx->time_base.den) {
......
4765774ab65412c9b7565b1b4da82998 *tests/data/fate/rgb24-mkv.matroska 0d081c8e151a922435830f95000d3c71 *tests/data/fate/rgb24-mkv.matroska
58321 tests/data/fate/rgb24-mkv.matroska 58321 tests/data/fate/rgb24-mkv.matroska
#tb 0: 1/10 #tb 0: 1/10
#media_type 0: video #media_type 0: video
......
c081514c38735524ab09dbd2a498b7b3 *./tests/data/lavf/lavf.mkv 5b982c8dfbadc71f51b206cbd10b9a71 *./tests/data/lavf/lavf.mkv
472875 ./tests/data/lavf/lavf.mkv 472875 ./tests/data/lavf/lavf.mkv
./tests/data/lavf/lavf.mkv CRC=0xec6c3c68 ./tests/data/lavf/lavf.mkv CRC=0xec6c3c68
d1fc3a31150d00aebbd674862640f701 *./tests/data/lavf/lavf.mkv b4a295bae8e6cf536563cb840386f3a4 *./tests/data/lavf/lavf.mkv
320551 ./tests/data/lavf/lavf.mkv 320551 ./tests/data/lavf/lavf.mkv
./tests/data/lavf/lavf.mkv CRC=0xec6c3c68 ./tests/data/lavf/lavf.mkv CRC=0xec6c3c68
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment