mirror of
				https://github.com/nyanmisaka/ffmpeg-rockchip.git
				synced 2025-10-31 20:42:49 +08:00 
			
		
		
		
	truespeech: simplify truespeech_read_frame() by using get_bits()
This commit is contained in:
		| @@ -21,6 +21,8 @@ | |||||||
|  |  | ||||||
| #include "libavutil/intreadwrite.h" | #include "libavutil/intreadwrite.h" | ||||||
| #include "avcodec.h" | #include "avcodec.h" | ||||||
|  | #include "dsputil.h" | ||||||
|  | #include "get_bits.h" | ||||||
|  |  | ||||||
| #include "truespeech_data.h" | #include "truespeech_data.h" | ||||||
| /** | /** | ||||||
| @@ -32,7 +34,9 @@ | |||||||
|  * TrueSpeech decoder context |  * TrueSpeech decoder context | ||||||
|  */ |  */ | ||||||
| typedef struct { | typedef struct { | ||||||
|  |     DSPContext dsp; | ||||||
|     /* input data */ |     /* input data */ | ||||||
|  |     uint8_t buffer[32]; | ||||||
|     int16_t vector[8];  ///< input vector: 5/5/4/4/4/3/3/3 |     int16_t vector[8];  ///< input vector: 5/5/4/4/4/3/3/3 | ||||||
|     int offset1[2];     ///< 8-bit value, used in one copying offset |     int offset1[2];     ///< 8-bit value, used in one copying offset | ||||||
|     int offset2[4];     ///< 7-bit value, encodes offsets for copying and for two-point filter |     int offset2[4];     ///< 7-bit value, encodes offsets for copying and for two-point filter | ||||||
| @@ -54,7 +58,7 @@ typedef struct { | |||||||
|  |  | ||||||
| static av_cold int truespeech_decode_init(AVCodecContext * avctx) | static av_cold int truespeech_decode_init(AVCodecContext * avctx) | ||||||
| { | { | ||||||
| //    TSContext *c = avctx->priv_data; |     TSContext *c = avctx->priv_data; | ||||||
|  |  | ||||||
|     if (avctx->channels != 1) { |     if (avctx->channels != 1) { | ||||||
|         av_log_ask_for_sample(avctx, "Unsupported channel count: %d\n", avctx->channels); |         av_log_ask_for_sample(avctx, "Unsupported channel count: %d\n", avctx->channels); | ||||||
| @@ -62,97 +66,58 @@ static av_cold int truespeech_decode_init(AVCodecContext * avctx) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     avctx->sample_fmt = AV_SAMPLE_FMT_S16; |     avctx->sample_fmt = AV_SAMPLE_FMT_S16; | ||||||
|  |  | ||||||
|  |     dsputil_init(&c->dsp, avctx); | ||||||
|  |  | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void truespeech_read_frame(TSContext *dec, const uint8_t *input) | static void truespeech_read_frame(TSContext *dec, const uint8_t *input) | ||||||
| { | { | ||||||
|     uint32_t t; |     GetBitContext gb; | ||||||
|  |  | ||||||
|     /* first dword */ |     dec->dsp.bswap_buf((uint32_t *)dec->buffer, (const uint32_t *)input, 8); | ||||||
|     t = AV_RL32(input); |     init_get_bits(&gb, dec->buffer, 32 * 8); | ||||||
|     input += 4; |  | ||||||
|  |  | ||||||
|     dec->flag = t & 1; |     dec->vector[7] = ts_codebook[7][get_bits(&gb, 3)]; | ||||||
|  |     dec->vector[6] = ts_codebook[6][get_bits(&gb, 3)]; | ||||||
|  |     dec->vector[5] = ts_codebook[5][get_bits(&gb, 3)]; | ||||||
|  |     dec->vector[4] = ts_codebook[4][get_bits(&gb, 4)]; | ||||||
|  |     dec->vector[3] = ts_codebook[3][get_bits(&gb, 4)]; | ||||||
|  |     dec->vector[2] = ts_codebook[2][get_bits(&gb, 4)]; | ||||||
|  |     dec->vector[1] = ts_codebook[1][get_bits(&gb, 5)]; | ||||||
|  |     dec->vector[0] = ts_codebook[0][get_bits(&gb, 5)]; | ||||||
|  |     dec->flag      = get_bits1(&gb); | ||||||
|  |  | ||||||
|     dec->vector[0] = ts_codebook[0][(t >>  1) & 0x1F]; |     dec->offset1[0] = get_bits(&gb, 4) << 4; | ||||||
|     dec->vector[1] = ts_codebook[1][(t >>  6) & 0x1F]; |     dec->offset2[3] = get_bits(&gb, 7); | ||||||
|     dec->vector[2] = ts_codebook[2][(t >> 11) &  0xF]; |     dec->offset2[2] = get_bits(&gb, 7); | ||||||
|     dec->vector[3] = ts_codebook[3][(t >> 15) &  0xF]; |     dec->offset2[1] = get_bits(&gb, 7); | ||||||
|     dec->vector[4] = ts_codebook[4][(t >> 19) &  0xF]; |     dec->offset2[0] = get_bits(&gb, 7); | ||||||
|     dec->vector[5] = ts_codebook[5][(t >> 23) &  0x7]; |  | ||||||
|     dec->vector[6] = ts_codebook[6][(t >> 26) &  0x7]; |  | ||||||
|     dec->vector[7] = ts_codebook[7][(t >> 29) &  0x7]; |  | ||||||
|  |  | ||||||
|     /* second dword */ |     dec->offset1[1]  = get_bits(&gb, 4); | ||||||
|     t = AV_RL32(input); |     dec->pulseval[1] = get_bits(&gb, 14); | ||||||
|     input += 4; |     dec->pulseval[0] = get_bits(&gb, 14); | ||||||
|  |  | ||||||
|     dec->offset2[0] = (t >>  0) & 0x7F; |     dec->offset1[1] |= get_bits(&gb, 4) << 4; | ||||||
|     dec->offset2[1] = (t >>  7) & 0x7F; |     dec->pulseval[3] = get_bits(&gb, 14); | ||||||
|     dec->offset2[2] = (t >> 14) & 0x7F; |     dec->pulseval[2] = get_bits(&gb, 14); | ||||||
|     dec->offset2[3] = (t >> 21) & 0x7F; |  | ||||||
|  |  | ||||||
|     dec->offset1[0] = ((t >> 28) & 0xF) << 4; |     dec->offset1[0] |= get_bits1(&gb); | ||||||
|  |     dec->pulsepos[0] = get_bits_long(&gb, 27); | ||||||
|  |     dec->pulseoff[0] = get_bits(&gb, 4); | ||||||
|  |  | ||||||
|     /* third dword */ |     dec->offset1[0] |= get_bits1(&gb) << 1; | ||||||
|     t = AV_RL32(input); |     dec->pulsepos[1] = get_bits_long(&gb, 27); | ||||||
|     input += 4; |     dec->pulseoff[1] = get_bits(&gb, 4); | ||||||
|  |  | ||||||
|     dec->pulseval[0] = (t >>  0) & 0x3FFF; |     dec->offset1[0] |= get_bits1(&gb) << 2; | ||||||
|     dec->pulseval[1] = (t >> 14) & 0x3FFF; |     dec->pulsepos[2] = get_bits_long(&gb, 27); | ||||||
|  |     dec->pulseoff[2] = get_bits(&gb, 4); | ||||||
|     dec->offset1[1] = (t >> 28) & 0x0F; |  | ||||||
|  |  | ||||||
|     /* fourth dword */ |  | ||||||
|     t = AV_RL32(input); |  | ||||||
|     input += 4; |  | ||||||
|  |  | ||||||
|     dec->pulseval[2] = (t >>  0) & 0x3FFF; |  | ||||||
|     dec->pulseval[3] = (t >> 14) & 0x3FFF; |  | ||||||
|  |  | ||||||
|     dec->offset1[1] |= ((t >> 28) & 0x0F) << 4; |  | ||||||
|  |  | ||||||
|     /* fifth dword */ |  | ||||||
|     t = AV_RL32(input); |  | ||||||
|     input += 4; |  | ||||||
|  |  | ||||||
|     dec->pulsepos[0] = (t >> 4) & 0x7FFFFFF; |  | ||||||
|  |  | ||||||
|     dec->pulseoff[0] = (t >> 0) & 0xF; |  | ||||||
|  |  | ||||||
|     dec->offset1[0] |= (t >> 31) & 1; |  | ||||||
|  |  | ||||||
|     /* sixth dword */ |  | ||||||
|     t = AV_RL32(input); |  | ||||||
|     input += 4; |  | ||||||
|  |  | ||||||
|     dec->pulsepos[1] = (t >> 4) & 0x7FFFFFF; |  | ||||||
|  |  | ||||||
|     dec->pulseoff[1] = (t >> 0) & 0xF; |  | ||||||
|  |  | ||||||
|     dec->offset1[0] |= ((t >> 31) & 1) << 1; |  | ||||||
|  |  | ||||||
|     /* seventh dword */ |  | ||||||
|     t = AV_RL32(input); |  | ||||||
|     input += 4; |  | ||||||
|  |  | ||||||
|     dec->pulsepos[2] = (t >> 4) & 0x7FFFFFF; |  | ||||||
|  |  | ||||||
|     dec->pulseoff[2] = (t >> 0) & 0xF; |  | ||||||
|  |  | ||||||
|     dec->offset1[0] |= ((t >> 31) & 1) << 2; |  | ||||||
|  |  | ||||||
|     /* eighth dword */ |  | ||||||
|     t = AV_RL32(input); |  | ||||||
|     input += 4; |  | ||||||
|  |  | ||||||
|     dec->pulsepos[3] = (t >> 4) & 0x7FFFFFF; |  | ||||||
|  |  | ||||||
|     dec->pulseoff[3] = (t >> 0) & 0xF; |  | ||||||
|  |  | ||||||
|     dec->offset1[0] |= ((t >> 31) & 1) << 3; |  | ||||||
|  |  | ||||||
|  |     dec->offset1[0] |= get_bits1(&gb) << 3; | ||||||
|  |     dec->pulsepos[3] = get_bits_long(&gb, 27); | ||||||
|  |     dec->pulseoff[3] = get_bits(&gb, 4); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void truespeech_correlate_filter(TSContext *dec) | static void truespeech_correlate_filter(TSContext *dec) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Justin Ruggles
					Justin Ruggles