X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fwmaenc.c;h=911291838284632ef4ab3ba25d6c8aae8ce3ee82;hb=d4a50a2100a2b3539d238e64af98e16f47b47a89;hp=6c687957c402c8aa02c0343124b728238e128e71;hpb=21ac1d47d136fbf95613189a8ec9fd6efbea9048;p=ffmpeg diff --git a/libavcodec/wmaenc.c b/libavcodec/wmaenc.c index 6c687957c40..91129183828 100644 --- a/libavcodec/wmaenc.c +++ b/libavcodec/wmaenc.c @@ -27,32 +27,31 @@ static int encode_init(AVCodecContext * avctx){ - WMADecodeContext *s = avctx->priv_data; + WMACodecContext *s = avctx->priv_data; int i, flags1, flags2; uint8_t *extradata; + s->avctx = avctx; + if(avctx->channels > MAX_CHANNELS) return -1; + if(avctx->bit_rate < 24*1000) + return -1; + /* extract flag infos */ flags1 = 0; flags2 = 1; if (avctx->codec->id == CODEC_ID_WMAV1) { extradata= av_malloc(4); avctx->extradata_size= 4; - extradata[0] = flags1; - extradata[1] = flags1>>8; - extradata[2] = flags2; - extradata[3] = flags2>>8; + AV_WL16(extradata, flags1); + AV_WL16(extradata+2, flags2); } else if (avctx->codec->id == CODEC_ID_WMAV2) { extradata= av_mallocz(10); avctx->extradata_size= 10; - extradata[0] = flags1; - extradata[1] = flags1>>8; - extradata[2] = flags1>>16; - extradata[3] = flags1>>24; - extradata[4] = flags2; - extradata[5] = flags2>>8; + AV_WL32(extradata, flags1); + AV_WL16(extradata+4, flags2); }else assert(0); avctx->extradata= extradata; @@ -64,7 +63,7 @@ static int encode_init(AVCodecContext * avctx){ /* init MDCT */ for(i = 0; i < s->nb_block_sizes; i++) - ff_mdct_init(&s->mdct_ctx[i], s->frame_len_bits - i + 1, 0); + ff_mdct_init(&s->mdct_ctx[i], s->frame_len_bits - i + 1, 0, 1.0); avctx->block_align= s->block_align= avctx->bit_rate*(int64_t)s->frame_len / (avctx->sample_rate*8); @@ -75,9 +74,10 @@ static int encode_init(AVCodecContext * avctx){ } -static void apply_window_and_mdct(AVCodecContext * avctx, signed short * audio, int len) { - WMADecodeContext *s = avctx->priv_data; +static void apply_window_and_mdct(AVCodecContext * avctx, const signed short * audio, int len) { + WMACodecContext *s = avctx->priv_data; int window_index= s->frame_len_bits - s->block_len_bits; + FFTContext *mdct = &s->mdct_ctx[window_index]; int i, j, channel; const float * win = s->windows[window_index]; int window_len = 1 << s->block_len_bits; @@ -87,15 +87,15 @@ static void apply_window_and_mdct(AVCodecContext * avctx, signed short * audio, memcpy(s->output, s->frame_out[channel], sizeof(float)*window_len); j = channel; for (i = 0; i < len; i++, j += avctx->channels){ - s->output[i+window_len] = audio[j] / n * win[i]; - s->frame_out[channel][i] = audio[j] / n * win[window_len - i - 1]; + s->output[i+window_len] = audio[j] / n * win[window_len - i - 1]; + s->frame_out[channel][i] = audio[j] / n * win[i]; } - ff_mdct_calc(&s->mdct_ctx[window_index], s->coefs[channel], s->output, s->mdct_tmp); + mdct->mdct_calc(mdct, s->coefs[channel], s->output); } } //FIXME use for decoding too -static void init_exp(WMADecodeContext *s, int ch, int *exp_param){ +static void init_exp(WMACodecContext *s, int ch, const int *exp_param){ int n; const uint16_t *ptr; float v, *q, max_scale, *q_end; @@ -116,7 +116,7 @@ static void init_exp(WMADecodeContext *s, int ch, int *exp_param){ s->max_exponent[ch] = max_scale; } -static void encode_exp_vlc(WMADecodeContext *s, int ch, const int *exp_param){ +static void encode_exp_vlc(WMACodecContext *s, int ch, const int *exp_param){ int last_exp; const uint16_t *ptr; float *q, *q_end; @@ -135,14 +135,14 @@ static void encode_exp_vlc(WMADecodeContext *s, int ch, const int *exp_param){ int exp = *exp_param++; int code = exp - last_exp + 60; assert(code >= 0 && code < 120); - put_bits(&s->pb, ff_wma_scale_huffbits[code], ff_wma_scale_huffcodes[code]); + put_bits(&s->pb, ff_aac_scalefactor_bits[code], ff_aac_scalefactor_code[code]); /* XXX: use a table */ q+= *ptr++; last_exp= exp; } } -static int encode_block(WMADecodeContext *s, float (*src_coefs)[BLOCK_MAX_SIZE], int total_gain){ +static int encode_block(WMACodecContext *s, float (*src_coefs)[BLOCK_MAX_SIZE], int total_gain){ int v, bsize, ch, coef_nb_bits, parse_exponents; float mdct_norm; int nb_coefs[MAX_CHANNELS]; @@ -179,14 +179,15 @@ static int encode_block(WMADecodeContext *s, float (*src_coefs)[BLOCK_MAX_SIZE], } for(ch = 0; ch < s->nb_channels; ch++) { - if (s->channel_coded[ch]= 1) { //FIXME + s->channel_coded[ch] = 1; //FIXME only set channel_coded when needed, instead of always + if (s->channel_coded[ch]) { init_exp(s, ch, fixed_exp); } } for(ch = 0; ch < s->nb_channels; ch++) { if (s->channel_coded[ch]) { - int16_t *coefs1; + WMACoef *coefs1; float *coefs, *exponents, mult; int i, n; @@ -264,7 +265,7 @@ static int encode_block(WMADecodeContext *s, float (*src_coefs)[BLOCK_MAX_SIZE], for(ch = 0; ch < s->nb_channels; ch++) { if (s->channel_coded[ch]) { int run, tindex; - int16_t *ptr, *eptr; + WMACoef *ptr, *eptr; tindex = (ch == 1 && s->ms_stereo); ptr = &s->coefs1[ch][0]; eptr = ptr + nb_coefs[ch]; @@ -287,10 +288,14 @@ static int encode_block(WMADecodeContext *s, float (*src_coefs)[BLOCK_MAX_SIZE], if(1<avctx->flags & CODEC_FLAG_BITEXACT)) abs_level=0x71A; + put_bits(&s->pb, coef_nb_bits, abs_level); put_bits(&s->pb, s->frame_len_bits, run); } - put_bits(&s->pb, 1, level > 0); + put_bits(&s->pb, 1, level < 0); //FIXME the sign is fliped somewhere run=0; }else{ run++; @@ -306,7 +311,7 @@ static int encode_block(WMADecodeContext *s, float (*src_coefs)[BLOCK_MAX_SIZE], return 0; } -static int encode_frame(WMADecodeContext *s, float (*src_coefs)[BLOCK_MAX_SIZE], uint8_t *buf, int buf_size, int total_gain){ +static int encode_frame(WMACodecContext *s, float (*src_coefs)[BLOCK_MAX_SIZE], uint8_t *buf, int buf_size, int total_gain){ init_put_bits(&s->pb, buf, buf_size); if (s->use_bit_reservoir) { @@ -323,9 +328,9 @@ static int encode_frame(WMADecodeContext *s, float (*src_coefs)[BLOCK_MAX_SIZE], static int encode_superframe(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){ - WMADecodeContext *s = avctx->priv_data; - short *samples = data; - int i, total_gain, best; + WMACodecContext *s = avctx->priv_data; + const short *samples = data; + int i, total_gain; s->block_len_bits= s->frame_len_bits; //required by non variable block len s->block_len = 1 << s->block_len_bits; @@ -376,27 +381,31 @@ static int encode_superframe(AVCodecContext *avctx, put_bits(&s->pb, 8, 'N'); flush_put_bits(&s->pb); - return pbBufPtr(&s->pb) - s->pb.buf; + return put_bits_ptr(&s->pb) - s->pb.buf; } -AVCodec wmav1_encoder = +AVCodec ff_wmav1_encoder = { "wmav1", - CODEC_TYPE_AUDIO, + AVMEDIA_TYPE_AUDIO, CODEC_ID_WMAV1, - sizeof(WMADecodeContext), + sizeof(WMACodecContext), encode_init, encode_superframe, ff_wma_end, + .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, + .long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 1"), }; -AVCodec wmav2_encoder = +AVCodec ff_wmav2_encoder = { "wmav2", - CODEC_TYPE_AUDIO, + AVMEDIA_TYPE_AUDIO, CODEC_ID_WMAV2, - sizeof(WMADecodeContext), + sizeof(WMACodecContext), encode_init, encode_superframe, ff_wma_end, + .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, + .long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 2"), };