[FFmpeg-devel] [PATCH] G.729 parameters decoding
Michael Niedermayer
michaelni
Thu Jun 11 12:19:21 CEST 2009
On Thu, Jun 11, 2009 at 01:35:48AM +0700, Vladimir Voroshilov wrote:
> 2009/6/11 Diego Biurrun <diego at biurrun.de>:
> > On Thu, Jun 11, 2009 at 01:22:35AM +0700, Vladimir Voroshilov wrote:
> >> Patch adds routine, which decodes one G.729 frame into vector of
> >> decoding parameters.
> >> Both G.729 and G.729D are supported.
> >>
> >> --- ffmpeg-r19127.orig/libavcodec/g729dec.c
> >> +++ ffmpeg-r19127.mod/libavcodec/g729dec.c
> >> @@ -162,12 +203,43 @@ static av_cold int decoder_init(AVCodecContext * avctx)
> >> +static void g729_bytes2parm(G729FormatDescription *format, const uint8_t *buf, int buf_size, G729Parameters *parm)
> >
> > Is the prefix needed?
> >
> > And extra good karma for breaking long lines.
> >
>
> Deeper night is the only time i can code :(
> Both fixed.
>
> --
> Regards,
> Vladimir Voroshilov mailto:voroshil at gmail.com
> JID: voroshil at gmail.com, voroshil at jabber.ru
> ICQ: 95587719
> g729dec.c | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
> 1 file changed, 82 insertions(+), 7 deletions(-)
> 88ce1485be321b60e87b9104600d01ffd05e0d1d 0004-Parameters-decoding-routine.131.patch
> From 95ebdd0e7d4bbcaa146de7d4bc539ccc015151c4 Mon Sep 17 00:00:00 2001
> From: Vladimir Voroshilov <voroshil at gmail.com>
> Date: Wed, 10 Jun 2009 10:44:57 +0700
> Subject: [PATCH] Parameters decoding routine
>
>
> diff --git ffmpeg-r19127.orig/libavcodec/g729dec.c ffmpeg-r19127.mod/libavcodec/g729dec.c
> index fcebcdb..4670ff4 100644
> --- ffmpeg-r19127.orig/libavcodec/g729dec.c
> +++ ffmpeg-r19127.mod/libavcodec/g729dec.c
> @@ -72,19 +72,59 @@
> #define SHARP_MAX 13017
>
> typedef struct {
> - int sample_rate;
> - uint8_t packed_frame_size; ///< input frame size(in bytes)
> - uint8_t unpacked_frame_size;///< output frame size (in bytes)
> - uint8_t fc_indexes_bits; ///< size (in bits) of fixed-codebook index entry
> + uint8_t ma_predictor; ///< switched MA predictor of LSP quantizer
> + uint8_t quantizer_1st; ///< first stage vector of quantizer
> + uint8_t quantizer_2nd_lo; ///< second stage lower vector of quantizer (size in bits)
> + uint8_t quantizer_2nd_hi; ///< second stage higher vector of quantizer (size in bits)
> + uint8_t parity[2]; ///< parity bit for pitch delay (size in bits)
> + uint8_t ac_index[2]; ///< adaptive codebook index
> + uint8_t pulses_signs[2]; ///< fixed-codebook vector pulse signs
> + int fc_indexes[2]; ///< fixed-codebook indexes
> + uint8_t gc_1st_index[2]; ///< gain codebook (first stage) index
> + uint8_t gc_2nd_index[2]; ///< gain codebook (second stage) index
> +} G729Parameters;
>
> - /// mr_energy = mean_energy + 10 * log10(2^26 * subframe_size) in (7.13)
> - int mr_energy;
> +typedef struct {
> + uint8_t ac_index_bits[2]; ///< adaptive codebook index for second subframe (size in bits)
> + uint8_t parity_bits[2]; ///< parity bit for pitch delay (size in bits)
> + uint8_t gc_1st_index_bits; ///< gain codebook (first stage) index (size in bits)
> + uint8_t gc_2nd_index_bits; ///< gain codebook (second stage) index (size in bits)
> + uint8_t fc_signs_bits; ///< number of pulses in fixed-codebook vector
> + uint8_t fc_indexes_bits; ///< size (in bits) of fixed-codebook index entry
> } G729FormatDescription;
>
> +typedef enum {
> + FORMAT_G729_8K = 0,
> + FORMAT_G729D_6K4,
> + FORMAT_COUNT,
> +} G729Formats;
useless
> +
> typedef struct {
> + const G729FormatDescription *format; ///< format index from formats array
this requires an extra dereference, aka speed loss
[...]
> @@ -115,8 +155,10 @@ static av_cold int decoder_init(AVCodecContext * avctx)
>
> if (avctx->bit_rate == 8000) {
> ctx->bytes_per_frame = 10;
> + ctx->format = &formats[FORMAT_G729_8K];
ctx->format = format_g729_8k
> } else if (avctx->bit_rate == 6400) {
> ctx->bytes_per_frame = 8;
> + ctx->format = &formats[FORMAT_G729D_6K4];
> } else {
> av_log(avctx, AV_LOG_ERROR, "Bitrate %d is not supported.\n", avctx->sample_rate);
> return AVERROR_NOFMT;
> @@ -134,7 +176,6 @@ static av_cold int decoder_init(AVCodecContext * avctx)
>
> /* Both 8kbit/s and 6.4kbit/s modes uses two subframes per frame. */
> avctx->frame_size = SUBFRAME_SIZE << 1;
> -
> return 0;
> }
>
cosmetics
> @@ -162,12 +203,44 @@ static av_cold int decoder_init(AVCodecContext * avctx)
> ( voicing && ctx->frame_erasure) ? 0 : ctx->gain_code,
> 1 << 13, 14, SUBFRAME_SIZE);
>
> +/**
> + * Decodes one G.729 frame (10 bytes long) into parameter vector.
> + * @param format used format (8k/4.4k/etc)
> + * @param buf 10 bytes of decoder parameters
> + * @param buf_size size of input buffer
> + * @param parm [out] decoded codec parameters
> + */
> +static void bytes2parm(G729FormatDescription *format, const uint8_t *buf,
> + int buf_size, G729Parameters *parm)
> +{
> + GetBitContext gb;
> + int i;
> +
> + init_get_bits(&gb, buf, buf_size);
> +
> + parm->ma_predictor = get_bits(&gb, 1);
> + parm->quantizer_1st = get_bits(&gb, VQ_1ST_BITS);
> + parm->quantizer_2nd_lo = get_bits(&gb, VQ_2ND_BITS);
> + parm->quantizer_2nd_hi = get_bits(&gb, VQ_2ND_BITS);
> +
> + for (i = 0; i < 2; i++) {
> + parm->ac_index[i] = get_bits(&gb, format->ac_index_bits[i]);
> + parm->parity[i] = get_bits(&gb, format->parity_bits[i]);
> + parm->fc_indexes[i] = get_bits(&gb, format->fc_indexes_bits);
> + parm->pulses_signs[i] = get_bits(&gb, format->fc_signs_bits);
> + parm->gc_1st_index[i] = get_bits(&gb, format->gc_1st_index_bits);
> + parm->gc_2nd_index[i] = get_bits(&gb, format->gc_2nd_index_bits);
> + }
> +}
iam not convinced that this loading into the struct is needed
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
The educated differ from the uneducated as much as the living from the
dead. -- Aristotle
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20090611/b12b24f4/attachment.pgp>
More information about the ffmpeg-devel
mailing list