Ticket #7426: reencode_non16bitsaudio.diff

File reencode_non16bitsaudio.diff, 3.9 KB (added by JYA, 14 years ago)

Convert non 16 bits audio into 16 bits audio for playback

  • mythplugins/mythmusic/mythmusic/avfdecoder.cpp

     
    6363    m_audioEnc(NULL),       m_audioDec(NULL),
    6464    m_pkt(&m_pkt1),         errcode(0),
    6565    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)
    6768{
    6869    setFilename(file);
    6970
     
    7778        deinit();
    7879
    7980    av_freep((void *)&m_samples);
     81    av_freep((void *)&m_samples2);
    8082
    8183    if (output_buf)
    8284    {
     
    149151            return false;
    150152        }
    151153    }
     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    }
    152165
    153166    if (!output_buf)
    154167        output_buf = new char[globalBufferSize];
     
    373386                break;
    374387            }
    375388
    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
    377424            unlock();
    378425
    379426            while (data_size > 0 && !done && !finish && !user_stop &&
  • mythplugins/mythmusic/mythmusic/avfdecoder.h

     
    88extern "C" {
    99#include <mythtv/libavformat/avformat.h>
    1010#include <mythtv/libavcodec/avcodec.h>
     11#include <mythtv/libavcodec/audioconvert.h>
    1112}
    1213
    1314class Metadata;
     
    6263
    6364    unsigned char *ptr;
    6465    int dec_len, data_size;
    65     int16_t *m_samples;
     66    int16_t *m_samples, *m_samples2;
     67    AVAudioConvert *reformat_ctx;
    6668};
    6769
    6870#endif
  • mythtv/libs/libavcodec/libavcodec.pro

     
    6060SOURCES += myth_utils.c
    6161
    6262inc.path = $${PREFIX}/include/mythtv/libavcodec/
    63 inc.files = avcodec.h x86/mmx.h opt.h
     63inc.files = avcodec.h audioconvert.h x86/mmx.h opt.h
    6464
    6565INSTALLS += inc
    6666