[FFmpeg-devel] [PATCH] G.729 parameters decoding

Vladimir Voroshilov voroshil
Wed Jun 17 21:11:40 CEST 2009


2009/6/13 Vladimir Voroshilov <voroshil at gmail.com>:
> 2009/6/11 Michael Niedermayer <michaelni at gmx.at>:
>> 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
>
> Removed from current patch. Will be added later, if needed.
>
>>
>>
>>> +
>>> ?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
>
> Done.
>
>>
>>
>>> ? ? ?} 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
>
> Fixed.
>
>>
>>
>>> @@ -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
>
> Structure removed in favor of local variables.
> decode_frame, bytes2parm,decode_frame_internal were merged into one routine.
> formats array splitted into two structures.
> parameters structure were removed.
> Updated patch is attached.

Ping.




-- 
Regards,
Vladimir Voroshilov     mailto:voroshil at gmail.com
JID: voroshil at gmail.com, voroshil at jabber.ru
ICQ: 95587719



More information about the ffmpeg-devel mailing list