+
+ if (dec->sample_fmt != is->audio_src_fmt) {
+ if (is->reformat_ctx)
+ av_audio_convert_free(is->reformat_ctx);
+ is->reformat_ctx= av_audio_convert_alloc(SAMPLE_FMT_S16, 1,
+ dec->sample_fmt, 1, NULL, 0);
+ if (!is->reformat_ctx) {
+ fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
+ avcodec_get_sample_fmt_name(dec->sample_fmt),
+ avcodec_get_sample_fmt_name(SAMPLE_FMT_S16));
+ break;
+ }
+ is->audio_src_fmt= dec->sample_fmt;
+ }
+
+ if (is->reformat_ctx) {
+ const void *ibuf[6]= {is->audio_buf1};
+ void *obuf[6]= {is->audio_buf2};
+ int istride[6]= {av_get_bits_per_sample_format(dec->sample_fmt)/8};
+ int ostride[6]= {2};
+ int len= data_size/istride[0];
+ if (av_audio_convert(is->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
+ printf("av_audio_convert() failed\n");
+ break;
+ }
+ is->audio_buf= is->audio_buf2;
+ /* FIXME: existing code assume that data_size equals framesize*channels*2
+ remove this legacy cruft */
+ data_size= len*2;
+ }else{
+ is->audio_buf= is->audio_buf1;
+ }
+