[PATCH 0/5] Fix probing display of stream codec properties
At some point after 4.4.2, the internal properties of AVCodecContext which revealed useful information (Closed Captions, Film Grain, etc.) stopped being printed in av_dump_format() and was fixed to its default value (0) in ffprobe. For example, ffprobe emits a stream level field "closed_captions" which simply does not work anymore. This was a useful method to detect Closed Captions given the correct probe/analyze parameters for the source file. This patchset aims to restore the functionality.
After avformat_find_stream_info() calls codec_close(), the properties are not copied in the newly created skeleton context returned by codec_close(). This breaks display of the properties when viewing stream information afterward e.g. via av_dump_format(). Copy the old properties over, thus fixing printing of the properties (such as Closed Captions) in av_dump_format() that broke sometime after 4.4.2. Signed-off-by: Marth64 <marth64@proxyid.net> --- libavformat/demux.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libavformat/demux.c b/libavformat/demux.c index dc65f9ad91..72d4ae7593 100644 --- a/libavformat/demux.c +++ b/libavformat/demux.c @@ -1298,6 +1298,7 @@ static int codec_close(FFStream *sti) if (ret < 0) goto fail; + avctx_new->properties = sti->avctx->properties; avctx_new->pkt_timebase = sti->avctx->pkt_timebase; #if FF_API_TICKS_PER_FRAME -- 2.34.1
Signed-off-by: Marth64 <marth64@proxyid.net> --- libavformat/avformat.c | 5 +++++ libavformat/avformat.h | 7 +++++++ 2 files changed, 12 insertions(+) diff --git a/libavformat/avformat.c b/libavformat/avformat.c index 140fb5b6aa..35eb0f3b62 100644 --- a/libavformat/avformat.c +++ b/libavformat/avformat.c @@ -850,6 +850,11 @@ AVRational av_stream_get_codec_timebase(const AVStream *st) return cffstream(st)->avctx ? cffstream(st)->avctx->time_base : cffstream(st)->transferred_mux_tb; } +unsigned av_stream_get_codec_properties(const AVStream *st) +{ + return cffstream(st)->avctx ? cffstream(st)->avctx->properties : 0; +} + void avpriv_set_pts_info(AVStream *st, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den) { diff --git a/libavformat/avformat.h b/libavformat/avformat.h index 8afdcd9fd0..f611f7a4a4 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -3072,6 +3072,13 @@ int avformat_transfer_internal_stream_timing_info(const AVOutputFormat *ofmt, */ AVRational av_stream_get_codec_timebase(const AVStream *st); +/** + * Get the internal codec properties from a stream. + * + * @param st input stream to extract the properties from + */ +unsigned av_stream_get_codec_properties(const AVStream *st); + /** * @} */ -- 2.34.1
Quoting Marth64 (2024-07-05 07:25:52)
Signed-off-by: Marth64 <marth64@proxyid.net> --- libavformat/avformat.c | 5 +++++ libavformat/avformat.h | 7 +++++++ 2 files changed, 12 insertions(+)
Strong no. Internal properties are internal, we should do less exposing of them, not more. -- Anton Khirnov
I understand why. Should ffprobe’s closed_caption field just be removed then? The feature doesn’t work.
Signed-off-by: Marth64 <marth64@proxyid.net> --- doc/APIchanges | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/APIchanges b/doc/APIchanges index ac7953a49c..3d2039647b 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -2,6 +2,9 @@ The last version increases of all libraries were on 2024-03-07 API changes, most recent first: +2024-07-04 - xxxxxxxxxx - lavu 59.29.100 - avformat.h + Add av_stream_get_codec_properties(). + 2024-07-02 - xxxxxxxxxx - lavu 59.28.100 - hwcontext_d3d12va.h Add AVD3D12VAFramesContext.flags -- 2.34.1
My bad, sending correct version update for lavf now.
Signed-off-by: Marth64 <marth64@proxyid.net> --- doc/APIchanges | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/APIchanges b/doc/APIchanges index ac7953a49c..80285d432d 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -2,6 +2,9 @@ The last version increases of all libraries were on 2024-03-07 API changes, most recent first: +2024-07-04 - xxxxxxxxxx - lavf 61.4.100 - avformat.h + Add av_stream_get_codec_properties(). + 2024-07-02 - xxxxxxxxxx - lavu 59.28.100 - hwcontext_d3d12va.h Add AVD3D12VAFramesContext.flags -- 2.34.1
Fixes the closed_captions and other properties fields emitted via ffprobe's outputs. Signed-off-by: Marth64 <marth64@proxyid.net> --- fftools/ffprobe.c | 1 + 1 file changed, 1 insertion(+) diff --git a/fftools/ffprobe.c b/fftools/ffprobe.c index 71d1ffc21f..ed2edcd638 100644 --- a/fftools/ffprobe.c +++ b/fftools/ffprobe.c @@ -3948,6 +3948,7 @@ static int open_input_file(InputFile *ifile, const char *filename, av_dict_set(&opts, "flags", "+copy_opaque", AV_DICT_MULTIKEY); + ist->dec_ctx->properties = av_stream_get_codec_properties(stream); ist->dec_ctx->pkt_timebase = stream->time_base; if (avcodec_open2(ist->dec_ctx, codec, &opts) < 0) { -- 2.34.1
With the patchset and with RCWT demuxer as validation, the source mp3ac325-4864-small.ts is confirmed to have eia_608 bytes. Signed-off-by: Marth64 <marth64@proxyid.net> --- tests/ref/fate/ts-demux | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ref/fate/ts-demux b/tests/ref/fate/ts-demux index ec4aeb2034..745c3cffec 100644 --- a/tests/ref/fate/ts-demux +++ b/tests/ref/fate/ts-demux @@ -23,7 +23,7 @@ packet|codec_type=audio|stream_index=2|pts=3912642700|pts_time=43473.807778|dts= packet|codec_type=video|stream_index=0|pts=3912686363|pts_time=43474.292922|dts=3912686363|dts_time=43474.292922|duration=1501|duration_time=0.016678|size=4944|pos=506660|flags=___|data_hash=CRC32:54a86cbb packet|codec_type=audio|stream_index=1|pts=3912644825|pts_time=43473.831389|dts=3912644825|dts_time=43473.831389|duration=2880|duration_time=0.032000|size=906|pos=474888|flags=K__|data_hash=CRC32:0893d398 packet|codec_type=audio|stream_index=2|pts=3912645580|pts_time=43473.839778|dts=3912645580|dts_time=43473.839778|duration=2880|duration_time=0.032000|size=354|pos=491808|flags=K__|data_hash=CRC32:f5963fa6 -stream|index=0|codec_name=mpeg2video|profile=4|codec_type=video|codec_tag_string=[2][0][0][0]|codec_tag=0x0002|width=1280|height=720|coded_width=0|coded_height=0|closed_captions=0|film_grain=0|has_b_frames=1|sample_aspect_ratio=1:1|display_aspect_ratio=16:9|pix_fmt=yuv420p|level=4|color_range=tv|color_space=unknown|color_transfer=unknown|color_primaries=unknown|chroma_location=left|field_order=progressive|refs=1|ts_id=32776|ts_packetsize=188|id=0x31|r_frame_rate=60000/1001|avg_frame_rate=60000/1001|time_base=1/90000|start_pts=3912669846|start_time=43474.109400|duration_ts=19519|duration=0.216878|bit_rate=15000000|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=15|extradata_size=150|extradata_hash=CRC32:53134fa8|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|side_datum/cpb_properties:side_data_type=CPB properties|side_datum/cpb_properties:max_bitrate=15000000|side_datum/cpb_properties:min_bitrate=0|side_datum/cpb_properties:avg_bitrate=0|side_datum/cpb_properties:buffer_size=9781248|side_datum/cpb_properties:vbv_delay=-1 +stream|index=0|codec_name=mpeg2video|profile=4|codec_type=video|codec_tag_string=[2][0][0][0]|codec_tag=0x0002|width=1280|height=720|coded_width=0|coded_height=0|closed_captions=1|film_grain=0|has_b_frames=1|sample_aspect_ratio=1:1|display_aspect_ratio=16:9|pix_fmt=yuv420p|level=4|color_range=tv|color_space=unknown|color_transfer=unknown|color_primaries=unknown|chroma_location=left|field_order=progressive|refs=1|ts_id=32776|ts_packetsize=188|id=0x31|r_frame_rate=60000/1001|avg_frame_rate=60000/1001|time_base=1/90000|start_pts=3912669846|start_time=43474.109400|duration_ts=19519|duration=0.216878|bit_rate=15000000|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=15|extradata_size=150|extradata_hash=CRC32:53134fa8|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|side_datum/cpb_properties:side_data_type=CPB properties|side_datum/cpb_properties:max_bitrate=15000000|side_datum/cpb_properties:min_bitrate=0|side_datum/cpb_properties:avg_bitrate=0|side_datum/cpb_properties:buffer_size=9781248|side_datum/cpb_properties:vbv_delay=-1 stream|index=1|codec_name=ac3|profile=unknown|codec_type=audio|codec_tag_string=[4][0][0][0]|codec_tag=0x0004|sample_fmt=fltp|sample_rate=48000|channels=6|channel_layout=5.1(side)|bits_per_sample=0|initial_padding=0|ts_id=32776|ts_packetsize=188|id=0x34|r_frame_rate=0/0|avg_frame_rate=0/0|time_base=1/90000|start_pts=3912633305|start_time=43473.703389|duration_ts=14400|duration=0.160000|bit_rate=384000|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=5|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|tag:language=eng stream|index=2|codec_name=ac3|profile=unknown|codec_type=audio|codec_tag_string=[4][0][0][0]|codec_tag=0x0004|sample_fmt=fltp|sample_rate=48000|channels=2|channel_layout=stereo|bits_per_sample=0|initial_padding=0|ts_id=32776|ts_packetsize=188|id=0x35|r_frame_rate=0/0|avg_frame_rate=0/0|time_base=1/90000|start_pts=3912634060|start_time=43473.711778|duration_ts=14400|duration=0.160000|bit_rate=192000|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=5|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|tag:language=es format|filename=mp3ac325-4864-small.ts|nb_streams=3|nb_programs=1|nb_stream_groups=0|format_name=mpegts|start_time=43473.703389|duration=0.622889|size=512000|bit_rate=6575810|probe_score=50 -- 2.34.1
participants (2)
-
Anton Khirnov -
Marth64