On 2014-08-24 13:00:11 +0000, Anton Khirnov wrote:
> ---
> libavcodec/avcodec.h | 145
> +++++++++++++++++++++++++++++++++++++++++++++++++++
> libavcodec/utils.c | 144 ++++++++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 289 insertions(+)
>
> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
> index c7fbed9..2a9c5ec 100644
> --- a/libavcodec/avcodec.h
> +++ b/libavcodec/avcodec.h
> @@ -3091,6 +3091,109 @@ typedef struct AVSubtitle {
> } AVSubtitle;
>
> /**
> + * This struct describes the properties of an encoded stream.
> + *
> + * sizeof(AVCodecParameters) is not a part of the public ABI, this struct
> must
> + * be allocated with avcodec_parameters_alloc() and freed with
> + * avcodec_parameters_free().
> + */
> +typedef struct AVCodecParameters {
> + /**
> + * General type of the encoded data.
> + */
> + enum AVMediaType codec_type;
> + /**
> + * Specific type of the encoded data (the codec used).
> + */
> + enum AVCodecID codec_id;
> + /**
> + * Additional information about the codec (corresponds to the AVI
> FOURCC).
> + */
or wav TWOCC I think
> + uint32_t codec_tag;
> +
> + /**
> + * Extra binary data needed for initializing the decoder,
> codec-dependent.
> + *
> + * Must be allocated with av_malloc() and will be freed by
> + * avcodec_parameters_free(). The allocated size of extradata must be at
> + * least extradata_size + FF_MIN_BUFFER_SIZE, with the padding bytes
> zeroed.
FF_INPUT_BUFFER_PADDING_SIZE; 16kB padding would be ridiculous
> + */
> + uint8_t *extradata;
> + /**
> + * Size of the extradata content in bytes.
> + */
> + int extradata_size;
> +
> + /**
> + * - video: the pixel format, the value corresponds to enum
> AVPixelFormat.
> + * - audio: the sample format, the value corresponds to enum
> AVSampleFormat.
> + */
> + int format;
> + /**
> + * The average bitrate of the encoded data (in bits per second).
> + */
> + int bit_rate;
> + int bits_per_coded_sample;
> +
> + /**
> + * Video only. The dimensions of the video frame in pixels.
> + */
> + int width;
> + int height;
> +
> + /**
> + * Video only. The order of the fields in interlaced video.
> + */
> + enum AVFieldOrder field_order;
> +
> + /**
> + * Video only. Additional colorspace characteristics.
> + */
> + enum AVColorRange color_range;
> + enum AVColorPrimaries color_primaries;
> + enum AVColorTransferCharacteristic color_trc;
> + enum AVColorSpace color_space;
> + enum AVChromaLocation chroma_location;
> +
> + /**
> + * Audio only. The channel layout bitmask. May be 0 if the channel
> layout is
> + * unknown or unspecified, otherwise the number of bits set must be
> equal to
> + * the channels field.
> + */
> + uint64_t channel_layout;
> + /**
> + * Audio only. The number of audio channels.
> + */
> + int channels;
> + /**
> + * Audio only. The number of audio samples per second.
> + */
> + int sample_rate;
> + /**
> + * Audio only. The number of bytes per coded audio frame, required by
> some
> + * formats.
> + *
> + * Corresponds to nBlockAlign in WAVEFORMATEX.
> + */
> + int block_align;
> +
> + /**
> + * Audio only. The amount of padding (in samples) inserted by the
> encoder at
> + * the beginning of the audio. I.e. this number of leading decoded
> samples
> + * must be discarded by the caller to get the original audio without
> leading
> + * padding.
> + */
> + int initial_padding;
> + /**
> + * Audio only. The amount of padding (in samples) appended by the
> encoder to
> + * the end of the audio. I.e. this number of decoded samples must be
> + * discarded by the caller from the end of the stream to get the original
> + * audio without any trailing padding.
> + */
> + int trailing_padding;
> +} AVCodecParameters;
I wonder if it make sense to encapsulate the audio/video specific values
in their own structs and embed an union of them. Probably too much
effort for little gain though.
> +
> +/**
> * If c is NULL, returns the first registered codec,
> * if c is non-NULL, returns the next registered codec after c,
> * or NULL if c is the last one.
> @@ -3188,6 +3291,48 @@ const AVClass *avcodec_get_class(void);
> */
> int avcodec_copy_context(AVCodecContext *dest, const AVCodecContext *src);
>
> +/**
> + * Allocate a new AVCodecParameters and set its fields to default values
> + * (unknown/invalid/0). The returned struct must be freed with
> + * avcodec_parameters_free().
> + */
> +AVCodecParameters *avcodec_parameters_alloc(void);
> +
> +/**
> + * Free an AVCodecParameters instance and everything associated with it and
> + * write NULL to the supplied pointer.
> + */
> +void avcodec_parameters_free(AVCodecParameters **par);
> +
> +/**
> + * Copy the contents of src to dst. Any allocated fields in dst are freed and
> + * replaced with newly allocated duplicates of the corresponding fields in
> src.
> + *
> + * @return >= 0 on success, a negative AVERROR code on failure.
> + */
> +int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters
> *src);
> +
> +/**
> + * Fill the parameters struct based on the values from the supplied codec
> + * context. Any allocated fields in par are freed and replaced with
> duplicates
> + * of the corresponding fields in codec.
> + *
> + * @return >= 0 on success, a negative AVERROR code on failure
> + */
> +int avcodec_parameters_from_context(AVCodecParameters *par,
> + const AVCodecContext *codec);
> +
> +/**
> + * Fill the codec context based on the values from the supplied codec
> + * parameters. Any allocated fields in codec that have a corresponding field
> in
> + * par are freed and replaced with duplicates of the corresponding field in
> par.
> + * Fields in codec that do not have a counterpart in par are not touched.
> + *
> + * @return >= 0 on success, a negative AVERROR code on failure.
> + */
> +int avcodec_parameters_to_context(AVCodecContext *codec,
> + const AVCodecParameters *par);
> +
> #if FF_API_AVFRAME_LAVC
> /**
> * @deprecated use av_frame_alloc()
> diff --git a/libavcodec/utils.c b/libavcodec/utils.c
> index e0f11d3..baa25eb 100644
> --- a/libavcodec/utils.c
> +++ b/libavcodec/utils.c
> @@ -2418,3 +2418,147 @@ const uint8_t *avpriv_find_start_code(const uint8_t
> *restrict p,
>
> return p + 4;
> }
> +
> +static void codec_parameters_reset(AVCodecParameters *par)
> +{
> + av_freep(&par->extradata);
> +
> + memset(par, 0, sizeof(*par));
> +
> + par->codec_type = AVMEDIA_TYPE_UNKNOWN;
> + par->codec_id = AV_CODEC_ID_NONE;
> + par->format = -1;
> + par->field_order = AV_FIELD_UNKNOWN;
> + par->color_range = AVCOL_RANGE_UNSPECIFIED;
> + par->color_primaries = AVCOL_PRI_UNSPECIFIED;
> + par->color_trc = AVCOL_TRC_UNSPECIFIED;
> + par->color_space = AVCOL_SPC_UNSPECIFIED;
> + par->chroma_location = AVCHROMA_LOC_UNSPECIFIED;
> +}
> +
> +AVCodecParameters *avcodec_parameters_alloc(void)
> +{
> + AVCodecParameters *par = av_mallocz(sizeof(*par));
> +
> + if (!par)
> + return NULL;
> + codec_parameters_reset(par);
> + return par;
> +}
> +
> +void avcodec_parameters_free(AVCodecParameters **ppar)
> +{
> + AVCodecParameters *par = *ppar;
> +
> + if (!par)
> + return;
> + codec_parameters_reset(par);
> +
> + av_freep(ppar);
> +}
> +
> +int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters
> *src)
> +{
> + codec_parameters_reset(dst);
> + memcpy(dst, src, sizeof(*dst));
> +
> + dst->extradata = NULL;
> + dst->extradata_size = 0;
> + if (src->extradata) {
> + dst->extradata = av_mallocz(src->extradata_size +
> FF_INPUT_BUFFER_PADDING_SIZE);
> + if (!dst->extradata)
> + return AVERROR(ENOMEM);
> + memcpy(dst->extradata, src->extradata, src->extradata_size);
> + dst->extradata_size = src->extradata_size;
> + }
> +
> + return 0;
> +}
> +
> +int avcodec_parameters_from_context(AVCodecParameters *par,
> + const AVCodecContext *codec)
> +{
> + codec_parameters_reset(par);
> +
> + par->codec_type = codec->codec_type;
> + par->codec_id = codec->codec_id;
> + par->codec_tag = codec->codec_tag;
> +
> + par->bit_rate = codec->bit_rate;
> + par->bits_per_coded_sample = codec->bits_per_coded_sample;
> +
> + switch (par->codec_type) {
> + case AVMEDIA_TYPE_VIDEO:
> + par->format = codec->pix_fmt;
> + par->width = codec->width;
> + par->height = codec->height;
> + par->field_order = codec->field_order;
> + par->color_range = codec->color_range;
> + par->color_primaries = codec->color_primaries;
> + par->color_trc = codec->color_trc;
> + par->color_space = codec->colorspace;
> + par->chroma_location = codec->chroma_sample_location;
> + break;
> + case AVMEDIA_TYPE_AUDIO:
> + par->format = codec->sample_fmt;
> + par->channel_layout = codec->channel_layout;
> + par->channels = codec->channels;
> + par->sample_rate = codec->sample_rate;
> + par->block_align = codec->block_align;
> + par->initial_padding = codec->initial_padding;
AVCodecContext has no field initial_padding here, same problem in
avcodec_parameters_to_context()
no problems spotted otherwise
Janne
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel