[FFmpeg-devel] [PATCH 4/8] avcodec/g728dec: G.728 decoder
James Almer
jamrial at gmail.com
Sun Jan 12 05:42:05 EET 2025
On 1/11/2025 11:37 PM, Peter Ross wrote:
> ---
> libavcodec/Makefile | 1 +
> libavcodec/allcodecs.c | 1 +
> libavcodec/codec_desc.c | 7 ++
> libavcodec/codec_id.h | 1 +
> libavcodec/g728data.h | 70 +++++++++++++
> libavcodec/g728dec.c | 213 ++++++++++++++++++++++++++++++++++++++++
> libavcodec/utils.c | 1 +
> 7 files changed, 294 insertions(+)
> create mode 100644 libavcodec/g728data.h
> create mode 100644 libavcodec/g728dec.c
[...]
> +
> +static int g728_decode_frame(AVCodecContext *avctx, AVFrame *frame,
> + int *got_frame_ptr, AVPacket *avpkt)
> +{
> + G728Context *s = avctx->priv_data;
> + GetBitContext gb;
> + int ret;
> +
> + if (avpkt->size < 5)
> + return AVERROR_INVALIDDATA;
> +
> + if ((ret = init_get_bits8(&gb, avpkt->data, avpkt->size)) < 0)
> + return ret;
> +
> + frame->nb_samples = 20;
> + if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
> + return ret;
> +
> + decode_frame(s, &gb, (float *)frame->data[0]);
I assume this means the codec is mono only, right? I see you set
AV_CODEC_CAP_CHANNEL_CONF below (meaning the decoder will set channel
information and not depend on the caller doing it), but then don't force
mono layout in avctx->ch_layout anywhere.
You need to do it in g728_decode_init(), first uninitializing the
existing layout and then setting it to mono.
> +
> + *got_frame_ptr = 1;
> +
> + return 5;
> +}
> +
> +const FFCodec ff_g728_decoder = {
> + .p.name = "g728",
> + CODEC_LONG_NAME("G.728)"),
> + .p.type = AVMEDIA_TYPE_AUDIO,
> + .p.id = AV_CODEC_ID_G728,
> + .priv_data_size = sizeof(G728Context),
> + .init = g728_decode_init,
> + .close = g728_decode_close,
> + FF_CODEC_DECODE_CB(g728_decode_frame),
> + .p.capabilities = AV_CODEC_CAP_CHANNEL_CONF |
> + AV_CODEC_CAP_DR1,
> + .p.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLT,
> + AV_SAMPLE_FMT_NONE },
> +};
> diff --git a/libavcodec/utils.c b/libavcodec/utils.c
> index dd846b4ae9..58b29c4c9d 100644
> --- a/libavcodec/utils.c
> +++ b/libavcodec/utils.c
> @@ -553,6 +553,7 @@ int av_get_bits_per_sample(enum AVCodecID codec_id)
> case AV_CODEC_ID_DFPWM:
> return 1;
> case AV_CODEC_ID_ADPCM_SBPRO_2:
> + case AV_CODEC_ID_G728:
> return 2;
> case AV_CODEC_ID_ADPCM_SBPRO_3:
> return 3;
>
>
> _______________________________________________
> 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".
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature.asc
Type: application/pgp-signature
Size: 495 bytes
Desc: OpenPGP digital signature
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20250112/2338e113/attachment.sig>
More information about the ffmpeg-devel
mailing list