[soc]: r4859 - in amr: amrnbdata.h amrnbdec.c
Author: cmcq Date: Fri Jul 31 14:43:11 2009 New Revision: 4859 Log: Comments: add references for frame decoding and note a PacketVideo infelicity Modified: amr/amrnbdata.h amr/amrnbdec.c Modified: amr/amrnbdata.h ============================================================================== --- amr/amrnbdata.h Fri Jul 31 06:43:12 2009 (r4858) +++ amr/amrnbdata.h Fri Jul 31 14:43:11 2009 (r4859) @@ -112,7 +112,7 @@ typedef struct { // The following order* tables are used to reorder the bitstream into the bit // allocation format as in the specification. The bits are grouped into three -// classes of importance. See the specification for more information. +// classes of importance. See 3GPP TS 26.101 for more information. #define AMR_LSF(variable, bit) {offsetof(AMRNBFrame, lsf[variable]) >> 1, bit} Modified: amr/amrnbdec.c ============================================================================== --- amr/amrnbdec.c Fri Jul 31 06:43:12 2009 (r4858) +++ amr/amrnbdec.c Fri Jul 31 14:43:11 2009 (r4859) @@ -118,7 +118,9 @@ static av_cold int amrnb_decode_init(AVC /** - * Decode the bitstream into the AMR parameters and discover the frame mode. + * Decode an RFC4867 speech frame into the AMR frame mode and parameters. + * + * The order of speech bits is specified by 3GPP TS 26.101. * * @param p the context * @param buf pointer to the input buffer @@ -155,7 +157,13 @@ static enum Mode decode_bitstream(AMRCon skip_bits(&p->gb, 4); // skip to the next byte if (get_bits1(&p->gb)) // use the update if there is one p->cur_frame_type = RX_SID_UPDATE; - *speech_mode = get_bits(&p->gb, 3); // speech mode indicator + /* RFC4867 specifies AMR IF1 from 3GPP TS 26.101 which reverses + * the Mode Indication bits. This is also used by the reference + * decoder. + * But PacketVideo uses IF2 - it stores these bits the other way + * round. The sample "sound.amr" uses IF2. + */ + *speech_mode = get_bits(&p->gb, 3); // IF2 speech mode indicator } else p->cur_frame_type = RX_SPEECH_GOOD; } else if (mode == NO_DATA) { @@ -1103,7 +1111,7 @@ static int amrnb_decode_frame(AVCodecCon int buf_size = avpkt->size; float *buf_out = data; // pointer to the output data buffer int i, subframe; // counters - enum Mode speech_mode = MODE_475; // ??? + enum Mode speech_mode = MODE_475; // mode indication for DTX frames float fixed_gain_factor; float exc_feedback[AMR_SUBFRAME_SIZE]; float fixed_vector[AMR_SUBFRAME_SIZE]; // algebraic code book (fixed) vector
participants (1)
-
cmcq