[FFmpeg-devel] [RFC] stream parsing
Michael Niedermayer
michaelni
Mon Sep 27 00:36:18 CEST 2010
On Sun, Sep 26, 2010 at 12:54:34PM +0200, Benjamin Larsson wrote:
>
> >
> > this looks strange
> > i would have expected a
> > if((codec->capabilities & CODEC_CAP_CHANNEL_CONF) && !channel_layout)
> > return 0;
> >
> > in has_codec_parameters()
>
>
> There is no AVCodec available in has_codec_parameters() only an
> AVCodecContext.
>
> >
> > but maybe this doesnt work for some case?
>
> It wont work as it's the wrong struct.
>
>
> >
> > at least your "if we dont have all parameters remove these 3 parameters"
> > is looking worse
> >
>
> This is what the AAC codec uses, I'm not saying its correct I just took
> something that worked. But IIRC something need to set these to 0 before
> opening the decoder otherwise it will use the values the demuxer set.
>
> Anyway I redid the patch, it's abit more logical now but pretty much the
> same.
>
> Btw in has_codec_parameters() there is a list of codecs with some
> special casing, I think these codecs should have this new capability set.
>
> MvH
> Benjamin Larsson
> libavcodec/avcodec.h | 5 +++++
> libavcodec/dca.c | 1 +
> libavformat/utils.c | 27 ++++++++++++++++++++-------
> 3 files changed, 26 insertions(+), 7 deletions(-)
> ab6630288f93c954106ef242caf7ab19da255387 codec_cap_channel_conf.diff
> Index: libavcodec/avcodec.h
> ===================================================================
> --- libavcodec/avcodec.h (revision 25194)
> +++ libavcodec/avcodec.h (working copy)
> @@ -684,7 +684,12 @@
> * encoders
> */
> #define CODEC_CAP_EXPERIMENTAL 0x0200
> +/**
> + * Codec should fill in channel configuration and samplerate instead of container
> + */
> +#define CODEC_CAP_CHANNEL_CONF 0x0400
>
> +
> //The following defines may change, don't expect compatibility if you use them.
> #define MB_TYPE_INTRA4x4 0x0001
> #define MB_TYPE_INTRA16x16 0x0002 //FIXME H.264-specific
> Index: libavcodec/dca.c
> ===================================================================
> --- libavcodec/dca.c (revision 25194)
> +++ libavcodec/dca.c (working copy)
> @@ -1500,4 +1500,5 @@
> .decode = dca_decode_frame,
> .close = dca_decode_end,
> .long_name = NULL_IF_CONFIG_SMALL("DCA (DTS Coherent Acoustics)"),
> + .capabilities = CODEC_CAP_CHANNEL_CONF,
> };
> Index: libavformat/utils.c
> ===================================================================
> --- libavformat/utils.c (revision 25194)
> +++ libavformat/utils.c (working copy)
> @@ -1995,12 +1995,22 @@
> #endif
> }
>
> -static int has_codec_parameters(AVCodecContext *enc)
> +static int has_codec_parameters(AVCodecContext *enc, AVCodec *codec)
> {
> int val;
> switch(enc->codec_type) {
> case AVMEDIA_TYPE_AUDIO:
> val = enc->sample_rate && enc->channels && enc->sample_fmt != SAMPLE_FMT_NONE;
> + /* Some containers report wrong information about channel configuration
> + * let the codecs handle it in those cases (dca for example)).
> + */
> + if (codec && codec->capabilities & CODEC_CAP_CHANNEL_CONF) {
> + enc->sample_rate = 0;
> + enc->channel_layout = 0;
> + enc->frame_size = 0;
> + enc->channels = 0;
> + return 0;
> + }
av_find_stream_info() will return once all streams has_codec_parameters()
return non zero
this explicitly returns 0 unconditional on any parameters being available or
not thus has_codec_parameters() will never return non zero for an affected
stream, leading to exit only by bug and time/pos limits
like i said the code should test if channel_layout has been set and
return 0 if not it should not set any variable to 0 because this is unneeded
that is unless it is actually needed but then id like to know why
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
Everything should be made as simple as possible, but not simpler.
-- Albert Einstein
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20100927/89d3126a/attachment.pgp>
More information about the ffmpeg-devel
mailing list