[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