Ticket #7426: reencode_non16bitsaudio.diff
File reencode_non16bitsaudio.diff, 3.9 KB (added by , 14 years ago) |
---|
-
mythplugins/mythmusic/mythmusic/avfdecoder.cpp
63 63 m_audioEnc(NULL), m_audioDec(NULL), 64 64 m_pkt(&m_pkt1), errcode(0), 65 65 ptr(NULL), dec_len(0), 66 data_size(0), m_samples(NULL) 66 data_size(0), m_samples(NULL), 67 m_samples2(NULL), reformat_ctx(NULL) 67 68 { 68 69 setFilename(file); 69 70 … … 77 78 deinit(); 78 79 79 80 av_freep((void *)&m_samples); 81 av_freep((void *)&m_samples2); 80 82 81 83 if (output_buf) 82 84 { … … 149 151 return false; 150 152 } 151 153 } 154 if (!m_samples2) 155 { 156 m_samples2 = (int16_t *)av_mallocz(AVCODEC_MAX_AUDIO_FRAME_SIZE / 2 * 157 sizeof(*m_samples2)); 158 if (!m_samples2) 159 { 160 VERBOSE(VB_GENERAL, "Could not allocate output buffer in " 161 "avfDecoder::initialize"); 162 return false; 163 } 164 } 152 165 153 166 if (!output_buf) 154 167 output_buf = new char[globalBufferSize]; … … 373 386 break; 374 387 } 375 388 376 s = (char *)m_samples; 389 if (m_audioDec->sample_fmt != SAMPLE_FMT_S16) 390 { 391 if (reformat_ctx) 392 av_audio_convert_free(reformat_ctx); 393 reformat_ctx = av_audio_convert_alloc(SAMPLE_FMT_S16, 1, 394 m_audioDec->sample_fmt, 1, 395 NULL, 0); 396 if (!reformat_ctx) 397 { 398 VERBOSE(VB_PLAYBACK, QString("Cannot convert %1 sample format to %2 sample format").arg(avcodec_get_sample_fmt_name(m_audioDec->sample_fmt)).arg(avcodec_get_sample_fmt_name(SAMPLE_FMT_S16))); 399 400 unlock(); 401 break; 402 } 403 404 const void *ibuf[6] = {m_samples}; 405 void *obuf[6] = {m_samples2}; 406 int istride[6] = {av_get_bits_per_sample_format(m_audioDec->sample_fmt)/8}; 407 int ostride[6] = {2}; 408 int len = data_size/istride[0]; 409 if (av_audio_convert(reformat_ctx, obuf, ostride, 410 ibuf, istride, len) < 0) 411 { 412 VERBOSE(VB_PLAYBACK, "av_audio_convert() failed"); 413 414 unlock(); 415 break; 416 } 417 418 data_size = len * 2; 419 s = (char *)m_samples2; 420 } 421 else 422 s = (char *)m_samples; 423 377 424 unlock(); 378 425 379 426 while (data_size > 0 && !done && !finish && !user_stop && -
mythplugins/mythmusic/mythmusic/avfdecoder.h
8 8 extern "C" { 9 9 #include <mythtv/libavformat/avformat.h> 10 10 #include <mythtv/libavcodec/avcodec.h> 11 #include <mythtv/libavcodec/audioconvert.h> 11 12 } 12 13 13 14 class Metadata; … … 62 63 63 64 unsigned char *ptr; 64 65 int dec_len, data_size; 65 int16_t *m_samples; 66 int16_t *m_samples, *m_samples2; 67 AVAudioConvert *reformat_ctx; 66 68 }; 67 69 68 70 #endif -
mythtv/libs/libavcodec/libavcodec.pro
60 60 SOURCES += myth_utils.c 61 61 62 62 inc.path = $${PREFIX}/include/mythtv/libavcodec/ 63 inc.files = avcodec.h x86/mmx.h opt.h63 inc.files = avcodec.h audioconvert.h x86/mmx.h opt.h 64 64 65 65 INSTALLS += inc 66 66