[FFmpeg-devel] [PATCH 2/3] avformat: Support s337m in mxf/wav/w64
Paul B Mahol
onemda at gmail.com
Fri Jul 26 19:51:10 EEST 2019
On Fri, Jul 26, 2019 at 6:45 PM Nicolas Gaullier <
nicolas.gaullier at arkena.com> wrote:
> ---
> libavformat/avformat.h | 7 +++++++
> libavformat/mxfdec.c | 20 +++++++++++++++++++-
> libavformat/options_table.h | 1 +
> libavformat/wavdec.c | 7 ++++++-
> 4 files changed, 33 insertions(+), 2 deletions(-)
>
> diff --git a/libavformat/avformat.h b/libavformat/avformat.h
> index 6eb329f13f..42bb094d81 100644
> --- a/libavformat/avformat.h
> +++ b/libavformat/avformat.h
> @@ -1951,6 +1951,13 @@ typedef struct AVFormatContext {
> * - decoding: set by user
> */
> int skip_estimate_duration_from_pts;
> +
> + /**
> + * Probe dolby_e in PCM streams
> + * - encoding: unused
> + * - decoding: set by user
> + */
> + int dolby_e_probe;
>
Unacceptable addition. Use AVOptions.
> } AVFormatContext;
>
> #if FF_API_FORMAT_GET_SET
> diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c
> index bb72fb9841..5b6eb9d756 100644
> --- a/libavformat/mxfdec.c
> +++ b/libavformat/mxfdec.c
> @@ -56,6 +56,7 @@
> #include "avformat.h"
> #include "internal.h"
> #include "mxf.h"
> +#include "s337m.h"
>
> #define MXF_MAX_CHUNK_SIZE (32 << 20)
>
> @@ -302,6 +303,8 @@ typedef struct MXFMetadataReadTableEntry {
> enum MXFMetadataSetType type;
> } MXFMetadataReadTableEntry;
>
> +static int mxf_read_packet_init = 0;
> +static int mxf_read_packet(AVFormatContext *s, AVPacket *pkt);
> static int mxf_read_close(AVFormatContext *s);
>
> /* partial keys to match */
> @@ -3247,6 +3250,19 @@ static int mxf_read_header(AVFormatContext *s)
> if ((ret = mxf_parse_structural_metadata(mxf)) < 0)
> goto fail;
>
> + if (mxf->fc->dolby_e_probe)
> + {
> + int i;
> + AVPacket *pkt = av_packet_alloc();
> + av_init_packet(pkt);
> + mxf_read_packet_init = 1;
> + for (i = 0; i < mxf->fc->nb_streams; i++)
> + mxf_read_packet(mxf->fc, pkt);
> + mxf_read_packet_init = 0;
> + av_freep(pkt);
> + avio_seek(s->pb, essence_offset, SEEK_SET);
> + }
> +
> for (int i = 0; i < s->nb_streams; i++)
> mxf_handle_missing_index_segment(mxf, s->streams[i]);
>
> @@ -3539,7 +3555,9 @@ static int mxf_read_packet(AVFormatContext *s,
> AVPacket *pkt)
> return ret;
> }
> } else {
> - ret = av_get_packet(s->pb, pkt, klv.length);
> + if (mxf_read_packet_init)
> + s337m_probe_stream(mxf->fc, &st);
> + ret = st->codecpar->codec_id == AV_CODEC_ID_DOLBY_E ?
> s337m_read_packet(s, pkt) : av_get_packet(s->pb, pkt, klv.length);
> if (ret < 0) {
> mxf->current_klv_data = (KLVPacket){{0}};
> return ret;
> diff --git a/libavformat/options_table.h b/libavformat/options_table.h
> index f2f077b34f..7f3c22d6bb 100644
> --- a/libavformat/options_table.h
> +++ b/libavformat/options_table.h
> @@ -111,6 +111,7 @@ static const AVOption avformat_options[] = {
> {"protocol_blacklist", "List of protocols that are not allowed to be
> used", OFFSET(protocol_blacklist), AV_OPT_TYPE_STRING, { .str = NULL },
> CHAR_MIN, CHAR_MAX, D },
> {"max_streams", "maximum number of streams", OFFSET(max_streams),
> AV_OPT_TYPE_INT, { .i64 = 1000 }, 0, INT_MAX, D },
> {"skip_estimate_duration_from_pts", "skip duration calculation in
> estimate_timings_from_pts", OFFSET(skip_estimate_duration_from_pts),
> AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, D},
> +{"dolbyeprobe", "probe dolby_e in PCM streams", OFFSET(dolby_e_probe),
> AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, D},
> {NULL},
> };
>
> diff --git a/libavformat/wavdec.c b/libavformat/wavdec.c
> index 52194f54ef..501c21f220 100644
> --- a/libavformat/wavdec.c
> +++ b/libavformat/wavdec.c
> @@ -41,6 +41,7 @@
> #include "riff.h"
> #include "w64.h"
> #include "spdif.h"
> +#include "s337m.h"
>
> typedef struct WAVDemuxContext {
> const AVClass *class;
> @@ -593,6 +594,8 @@ break_loop:
> } else if (st->codecpar->codec_id == AV_CODEC_ID_ADPCM_MS &&
> st->codecpar->channels > 2) {
> st->codecpar->block_align *= st->codecpar->channels;
> }
> + if (s->dolby_e_probe)
> + s337m_probe_stream(s, &st);
>
> ff_metadata_conv_ctx(s, NULL, wav_metadata_conv);
> ff_metadata_conv_ctx(s, NULL, ff_riff_info_conv);
> @@ -708,7 +711,7 @@ smv_out:
> size = (size / st->codecpar->block_align) *
> st->codecpar->block_align;
> }
> size = FFMIN(size, left);
> - ret = av_get_packet(s->pb, pkt, size);
> + ret = st->codecpar->codec_id == AV_CODEC_ID_DOLBY_E ?
> s337m_read_packet(s, pkt) : av_get_packet(s->pb, pkt, size);
> if (ret < 0)
> return ret;
> pkt->stream_index = 0;
> @@ -895,6 +898,8 @@ static int w64_read_header(AVFormatContext *s)
> st->need_parsing = AVSTREAM_PARSE_FULL_RAW;
>
> avio_seek(pb, data_ofs, SEEK_SET);
> + if (s->dolby_e_probe)
> + s337m_probe_stream(s, &st);
>
> set_spdif(s, wav);
>
> --
> 2.14.1.windows.1
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
More information about the ffmpeg-devel
mailing list