[FFmpeg-devel] [PATCH] lavc/parser: export resolution and format in AVCodecContext if not already set
Michael Niedermayer
michael at niedermayer.cc
Tue Mar 15 18:26:00 CET 2016
On Tue, Mar 15, 2016 at 08:36:41AM -0500, Rodger Combs wrote:
> This allows avformat_find_stream_info to finish without opening a decoder in
> more cases.
>
> Since decoders still export some information that the corresponding parsers
> don't, this causes some fields to be unset in ffprobe output where the
> decoder would previously have only been called in avformat_find_stream_info.
> If this is a problem, the parsers should be updated to report that information
> as well.
> ---
> libavcodec/parser.c | 12 +++++++
> tests/ref/fate/concat-demuxer-extended-lavf-mxf | 2 +-
> .../ref/fate/concat-demuxer-extended-lavf-mxf_d10 | 2 +-
> tests/ref/fate/concat-demuxer-simple1-lavf-mxf | 2 +-
> tests/ref/fate/concat-demuxer-simple1-lavf-mxf_d10 | 2 +-
> tests/ref/fate/concat-demuxer-simple2-lavf-ts | 2 +-
> tests/ref/seek/vsynth_lena-mpeg1 | 38 +++++++++++-----------
> 7 files changed, 36 insertions(+), 24 deletions(-)
>
> diff --git a/libavcodec/parser.c b/libavcodec/parser.c
> index d25d261..34b2c86 100644
> --- a/libavcodec/parser.c
> +++ b/libavcodec/parser.c
> @@ -180,6 +180,18 @@ int av_parser_parse2(AVCodecParserContext *s, AVCodecContext *avctx,
> index = s->parser->parser_parse(s, avctx, (const uint8_t **) poutbuf,
> poutbuf_size, buf, buf_size);
> av_assert0(index > -0x20000000); // The API does not allow returning AVERROR codes
> +#define FILL(name) if(s->name > 0 && avctx->name <= 0) avctx->name = s->name
> + if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
> + FILL(coded_width);
> + FILL(coded_height);
> + FILL(width);
> + FILL(height);
> + if (s->format >= 0 && avctx->pix_fmt < 0)
> + avctx->pix_fmt = s->format;
> + } else if (avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
> + if (s->format >= 0 && avctx->sample_fmt < 0)
> + avctx->sample_fmt = s->format;
> + }
> /* update the file pointer */
> if (*poutbuf_size) {
> /* fill the data for the current frame */
[...]
> --- a/tests/ref/seek/vsynth_lena-mpeg1
> +++ b/tests/ref/seek/vsynth_lena-mpeg1
> @@ -1,46 +1,46 @@
> ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 0 size: 9779
> ret: 0 st:-1 flags:0 ts:-1.000000
> -ret: 0 st: 0 flags:1 dts: 0.000000 pts: NOPTS pos: 0 size: 9779
> +ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 0 size: 9779
> ret: 0 st:-1 flags:1 ts: 1.894167
> -ret: 0 st: 0 flags:1 dts: 1.440000 pts: NOPTS pos: 124255 size: 11796
> +ret: 0 st: 0 flags:1 dts: 1.440000 pts: 1.440000 pos: 124255 size: 11796
> ret: 0 st: 0 flags:0 ts: 0.788334
> -ret: 0 st: 0 flags:1 dts: 0.960000 pts: NOPTS pos: 76706 size: 10792
> +ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 76706 size: 10792
i suspect these pts values are wrong mpeg1/2 generally has dts != pts
the parsers have to initialize at least the timestamp / timebase /
delay related stuff
in case of b frames this will result in timestamps being out of
order before the libavformat core realizes it got a wrong values
from the parser/decoder
[...]
0, 0, 0, 48000, 9779, 0xf74ad5eb
0, 48000, 48000, 48000, 2676, 0x0ba8d970, F=0x0
0, 96000, 96000, 48000, 1098, 0x0a75192d, F=0x0
0, 144000, -9223372036854775808, 48000, 2920, 0xecf9526c, F=0x0
0, 192000, 192000, 48000, 1375, 0x65a69783, F=0x0
0, 240000, -9223372036854775808, 48000, 2952, 0x1110633b, F=0x0
-
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
Democracy is the form of government in which you can choose your dictator
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20160315/d26d4c4a/attachment.sig>
More information about the ffmpeg-devel
mailing list