00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <QObject>
00023 #include <QIODevice>
00024 #include <QFile>
00025
00026
00027 #include <mythconfig.h>
00028 #include <mythcontext.h>
00029 #include <audiooutput.h>
00030 #include <mythlogging.h>
00031
00032 using namespace std;
00033
00034
00035 #include "avfdecoder.h"
00036 #include "metaioavfcomment.h"
00037 #include "metaioid3.h"
00038 #include "metaioflacvorbis.h"
00039 #include "metaiooggvorbis.h"
00040 #include "metaiomp4.h"
00041 #include "metaiowavpack.h"
00042
00043 extern "C" {
00044 #include "libavformat/avio.h"
00045 }
00046
00047
00048 #define BUFFER_SIZE 8192
00049
00050
00051 static int ReadFunc(void *opaque, uint8_t *buf, int buf_size)
00052 {
00053 QIODevice *io = (QIODevice*)opaque;
00054
00055 buf_size = min(buf_size, (int) io->bytesAvailable());
00056 return io->read((char*)buf, buf_size);
00057 }
00058
00059 static int WriteFunc(void *opaque, uint8_t *buf, int buf_size)
00060 {
00061 (void)opaque;
00062 (void)buf;
00063 (void)buf_size;
00064
00065 return -1;
00066 }
00067
00068 static int64_t SeekFunc(void *opaque, int64_t offset, int whence)
00069 {
00070 (void)opaque;
00071 (void)offset;
00072 (void)whence;
00073
00074 return -1;
00075 }
00076
00077 avfDecoder::avfDecoder(const QString &file, DecoderFactory *d, QIODevice *i,
00078 AudioOutput *o) :
00079 Decoder(d, i, o),
00080 inited(false), user_stop(false),
00081 stat(0), output_buf(NULL),
00082 output_at(0), bks(0),
00083 bksFrames(0), decodeBytes(0),
00084 finish(false),
00085 freq(0), bitrate(0),
00086 m_sampleFmt(FORMAT_NONE), m_channels(0),
00087 seekTime(-1.0), devicename(""),
00088 m_inputFormat(NULL), m_inputContext(NULL),
00089 m_codec(NULL),
00090 m_audioDec(NULL), m_inputIsFile(false),
00091 m_buffer(NULL), m_byteIOContext(NULL),
00092 errcode(0)
00093 {
00094 setObjectName("avfDecoder");
00095 setFilename(file);
00096 }
00097
00098 avfDecoder::~avfDecoder(void)
00099 {
00100 if (inited)
00101 deinit();
00102 }
00103
00104 void avfDecoder::stop()
00105 {
00106 user_stop = true;
00107 }
00108
00109 void avfDecoder::writeBlock()
00110 {
00111 while (!user_stop && seekTime <= 0)
00112 {
00113 if(output()->AddFrames(output_buf, bksFrames, -1))
00114 {
00115 output_at -= bks;
00116 memmove(output_buf, output_buf + bks, output_at);
00117 break;
00118 }
00119 else
00120 usleep(output()->GetAudioBufferedTime()<<9);
00121 }
00122 }
00123
00124 bool avfDecoder::initialize()
00125 {
00126 inited = user_stop = finish = false;
00127 freq = bitrate = 0;
00128 stat = m_channels = 0;
00129 m_sampleFmt = FORMAT_NONE;
00130 seekTime = -1.0;
00131
00132
00133 if (!output())
00134 {
00135 error("avfDecoder: initialise called with a NULL audiooutput");
00136 return false;
00137 }
00138
00139
00140 av_register_all();
00141
00142 output()->PauseUntilBuffered();
00143
00144 m_inputIsFile = !input()->isSequential();
00145
00146 if (m_inputContext)
00147 avformat_free_context(m_inputContext);
00148
00149 m_inputContext = avformat_alloc_context();
00150
00151
00152 if (m_inputIsFile)
00153 {
00154 filename = ((QFile *)input())->fileName();
00155 LOG(VB_PLAYBACK, LOG_INFO,
00156 QString("avfDecoder: playing file %1").arg(filename));
00157 }
00158 else
00159 {
00160
00161
00162 m_buffer = (unsigned char*) av_malloc(BUFFER_SIZE + FF_INPUT_BUFFER_PADDING_SIZE);
00163 m_byteIOContext = avio_alloc_context(m_buffer, BUFFER_SIZE, 0, input(),
00164 &ReadFunc, &WriteFunc, &SeekFunc);
00165 filename = "stream";
00166
00167 m_byteIOContext->seekable = 0;
00168
00169
00170 AVProbeData probe_data;
00171 probe_data.filename = filename.toLocal8Bit().constData();
00172 probe_data.buf_size = min(BUFFER_SIZE, (int) input()->bytesAvailable());
00173 probe_data.buf = m_buffer;
00174 input()->read((char*)probe_data.buf, probe_data.buf_size);
00175 m_inputFormat = av_probe_input_format(&probe_data, 1);
00176
00177 if (!m_inputFormat)
00178 {
00179 error("Could not identify the stream type in "
00180 "avfDecoder::initialize");
00181 deinit();
00182 return false;
00183 }
00184
00185 LOG(VB_PLAYBACK, LOG_INFO,
00186 QString("avfDecoder: playing stream, format probed is: %1")
00187 .arg(m_inputFormat->long_name));
00188 }
00189
00190
00191
00192 int err;
00193 if (m_inputIsFile)
00194 err = avformat_open_input(&m_inputContext,
00195 filename.toLocal8Bit().constData(),
00196 m_inputFormat, NULL);
00197 else
00198 {
00199 m_inputContext->pb = m_byteIOContext;
00200 err = avformat_open_input(&m_inputContext, "decoder",
00201 m_inputFormat, NULL);
00202 }
00203
00204 if (err < 0)
00205 {
00206 LOG(VB_GENERAL, LOG_ERR,
00207 QString("Could not open file (%1)").arg(filename));
00208 LOG(VB_GENERAL, LOG_ERR, QString("AV decoder. Error: %1").arg(err));
00209 error(QString("Could not open file (%1)").arg(filename) +
00210 QString("\nAV decoder. Error: %1").arg(err));
00211 deinit();
00212 return false;
00213 }
00214
00215
00216
00217 if (avformat_find_stream_info(m_inputContext, NULL) < 0)
00218 {
00219 error("Could not determine the stream format.");
00220 deinit();
00221 return false;
00222 }
00223
00224
00225 m_audioDec = m_inputContext->streams[0]->codec;
00226
00227
00228 m_inputFormat = m_inputContext->iformat;
00229
00230
00231
00232
00233
00234 m_codec = avcodec_find_decoder(m_audioDec->codec_id);
00235 if (!m_codec)
00236 {
00237 error(QString("Could not find audio codec: %1")
00238 .arg(m_audioDec->codec_id));
00239 deinit();
00240 return false;
00241 }
00242
00243 if (avcodec_open2(m_audioDec, m_codec, NULL) < 0)
00244 {
00245 error(QString("Could not open audio codec: %1")
00246 .arg(m_audioDec->codec_id));
00247 deinit();
00248 return false;
00249 }
00250
00251 freq = m_audioDec->sample_rate;
00252 m_channels = m_audioDec->channels;
00253
00254 if (m_channels <= 0)
00255 {
00256 error(QString("AVCodecContext tells us %1 channels are "
00257 "available, this is bad, bailing.")
00258 .arg(m_channels));
00259 deinit();
00260 return false;
00261 }
00262
00263 switch (m_audioDec->sample_fmt)
00264 {
00265 case AV_SAMPLE_FMT_U8: m_sampleFmt = FORMAT_U8; break;
00266 case AV_SAMPLE_FMT_S16: m_sampleFmt = FORMAT_S16; break;
00267 case AV_SAMPLE_FMT_FLT: m_sampleFmt = FORMAT_FLT; break;
00268 case AV_SAMPLE_FMT_DBL: m_sampleFmt = FORMAT_NONE; break;
00269 case AV_SAMPLE_FMT_S32:
00270 switch (m_audioDec->bits_per_raw_sample)
00271 {
00272 case 0: m_sampleFmt = FORMAT_S32; break;
00273 case 24: m_sampleFmt = FORMAT_S24; break;
00274 case 32: m_sampleFmt = FORMAT_S32; break;
00275 default: m_sampleFmt = FORMAT_NONE;
00276 }
00277 break;
00278 default: m_sampleFmt = FORMAT_NONE;
00279 }
00280
00281 if (m_sampleFmt == FORMAT_NONE)
00282 {
00283 int bps = av_get_bytes_per_sample(m_audioDec->sample_fmt) << 3;
00284 if (m_audioDec->sample_fmt == AV_SAMPLE_FMT_S32 &&
00285 m_audioDec->bits_per_raw_sample)
00286 {
00287 bps = m_audioDec->bits_per_raw_sample;
00288 }
00289 error(QString("Error: Unsupported sample format "
00290 "with %1 bits").arg(bps));
00291 return false;
00292 }
00293
00294 const AudioSettings settings(m_sampleFmt, m_audioDec->channels,
00295 m_audioDec->codec_id,
00296 m_audioDec->sample_rate, false);
00297
00298 output()->Reconfigure(settings);
00299 output()->SetSourceBitrate(m_audioDec->bit_rate);
00300
00301
00302 bks = (freq * m_channels *
00303 AudioOutputSettings::SampleSize(m_sampleFmt)) / 50;
00304
00305 bksFrames = freq / 50;
00306
00307
00308 decodeBytes = bks << 3;
00309
00310 output_buf = (char *)av_malloc(decodeBytes +
00311 AVCODEC_MAX_AUDIO_FRAME_SIZE * 2);
00312 output_at = 0;
00313
00314 inited = true;
00315 return true;
00316 }
00317
00318 void avfDecoder::seek(double pos)
00319 {
00320 if (m_inputIsFile)
00321 seekTime = pos;
00322 }
00323
00324 void avfDecoder::deinit()
00325 {
00326 inited = user_stop = finish = false;
00327 freq = bitrate = 0;
00328 stat = m_channels = 0;
00329 m_sampleFmt = FORMAT_NONE;
00330 setInput(0);
00331 setOutput(0);
00332
00333
00334 if (m_inputContext)
00335 {
00336 avformat_close_input(&m_inputContext);
00337 m_inputContext = NULL;
00338 }
00339
00340 if (output_buf)
00341 av_free(output_buf);
00342 output_buf = NULL;
00343
00344 m_codec = NULL;
00345 m_audioDec = NULL;
00346 m_inputFormat = NULL;
00347
00348 if (m_buffer)
00349 {
00350 av_free(m_buffer);
00351 m_buffer = NULL;
00352 }
00353
00354 if (m_byteIOContext)
00355 {
00356 delete m_byteIOContext;
00357 m_byteIOContext = NULL;
00358 }
00359 }
00360
00361 void avfDecoder::run()
00362 {
00363 RunProlog();
00364 if (!inited)
00365 {
00366 RunEpilog();
00367 return;
00368 }
00369
00370 AVPacket pkt, tmp_pkt;
00371 AVFrame *frame = avcodec_alloc_frame();
00372 int data_size, dec_len;
00373 uint fill, total;
00374
00375 uint thresh = bks * 12 / AudioOutputSettings::SampleSize(m_sampleFmt);
00376
00377 stat = DecoderEvent::Decoding;
00378 {
00379 DecoderEvent e((DecoderEvent::Type) stat);
00380 dispatch(e);
00381 }
00382
00383 av_read_play(m_inputContext);
00384
00385 while (!finish && !user_stop)
00386 {
00387
00388 if (seekTime >= 0.0)
00389 {
00390 LOG(VB_GENERAL, LOG_INFO, QString("avfdecoder.o: seek time %1")
00391 .arg(seekTime));
00392
00393 if (av_seek_frame(m_inputContext, -1,
00394 (int64_t)(seekTime * AV_TIME_BASE), 0) < 0)
00395 LOG(VB_GENERAL, LOG_ERR, "Error seeking");
00396
00397 seekTime = -1.0;
00398 }
00399
00400
00401 if (output_at < bks)
00402 {
00403 while (output_at < decodeBytes &&
00404 !finish && !user_stop && seekTime <= 0.0)
00405 {
00406
00407 if (av_read_frame(m_inputContext, &pkt) < 0)
00408 {
00409 LOG(VB_GENERAL, LOG_ERR, "Read frame failed");
00410 LOG(VB_FILE, LOG_ERR, ("... for file '" + filename) + "'");
00411 finish = true;
00412 break;
00413 }
00414
00415 av_init_packet(&tmp_pkt);
00416 tmp_pkt.data = pkt.data;
00417 tmp_pkt.size = pkt.size;
00418
00419 while (tmp_pkt.size > 0 && !finish &&
00420 !user_stop && seekTime <= 0.0)
00421 {
00422
00423 int got_frame = 0;
00424
00425 data_size = AVCODEC_MAX_AUDIO_FRAME_SIZE;
00426 dec_len = avcodec_decode_audio4(m_audioDec, frame,
00427 &got_frame, &tmp_pkt);
00428 if (dec_len < 0 || !got_frame)
00429 break;
00430
00431 data_size =
00432 av_samples_get_buffer_size(NULL,
00433 m_audioDec->channels,
00434 frame->nb_samples,
00435 m_audioDec->sample_fmt,
00436 1);
00437
00438 memcpy((char *)(output_buf + output_at),
00439 frame->extended_data[0], data_size);
00440
00441
00442 output_at += data_size;
00443 tmp_pkt.size -= dec_len;
00444 tmp_pkt.data += dec_len;
00445 }
00446
00447 av_free_packet(&pkt);
00448 }
00449 }
00450
00451 if (!output())
00452 continue;
00453
00454
00455 while (!finish && !user_stop && seekTime <= 0.0)
00456 {
00457 output()->GetBufferStatus(fill, total);
00458
00459
00460 if (fill < thresh<<3)
00461 break;
00462 else
00463
00464 usleep(output()->GetAudioBufferedTime()<<9);
00465 }
00466
00467
00468 if (!user_stop && output_at >= bks && fill <= total - thresh)
00469 writeBlock();
00470 }
00471
00472 if (user_stop)
00473 inited = false;
00474
00475 else if (output())
00476 {
00477
00478 while (output_at >= bks)
00479 writeBlock();
00480
00481
00482 output()->Drain();
00483 }
00484
00485 if (finish)
00486 stat = DecoderEvent::Finished;
00487 else if (user_stop)
00488 stat = DecoderEvent::Stopped;
00489
00490 {
00491 DecoderEvent e((DecoderEvent::Type) stat);
00492 dispatch(e);
00493 }
00494
00495 av_free(frame);
00496
00497 deinit();
00498 RunEpilog();
00499 }
00500
00501 MetaIO* avfDecoder::doCreateTagger(void)
00502 {
00503 QString extension = filename.section('.', -1);
00504
00505 if (extension == "mp3")
00506 return new MetaIOID3();
00507 else if (extension == "ogg" || extension == "oga")
00508 return new MetaIOOggVorbis();
00509 else if (extension == "flac")
00510 {
00511 MetaIOID3 *file = new MetaIOID3();
00512 if (file->TagExists(filename))
00513 return file;
00514 else
00515 return new MetaIOFLACVorbis();
00516 }
00517 else if (extension == "m4a")
00518 return new MetaIOMP4();
00519 else if (extension == "wv")
00520 return new MetaIOWavPack();
00521 else
00522 return new MetaIOAVFComment();
00523 }
00524
00525 bool avfDecoderFactory::supports(const QString &source) const
00526 {
00527 QStringList list = extension().split("|", QString::SkipEmptyParts);
00528 for (QStringList::const_iterator it = list.begin(); it != list.end(); ++it)
00529 {
00530 if (*it == source.right((*it).length()).toLower())
00531 return true;
00532 }
00533
00534 return false;
00535 }
00536
00537 const QString &avfDecoderFactory::extension() const
00538 {
00539 static QString ext(".mp3|.mp2|.ogg|.oga|.flac|.wma|.wav|.ac3|.oma|.omg|"
00540 ".atp|.ra|.dts|.aac|.m4a|.aa3|.tta|.mka|.aiff|.swa|.wv");
00541 return ext;
00542 }
00543
00544 const QString &avfDecoderFactory::description() const
00545 {
00546 static QString desc(QObject::tr("Internal Decoder"));
00547 return desc;
00548 }
00549
00550 Decoder *avfDecoderFactory::create(const QString &file, QIODevice *input,
00551 AudioOutput *output, bool deletable)
00552 {
00553 if (deletable)
00554 return new avfDecoder(file, this, input, output);
00555
00556 static avfDecoder *decoder = 0;
00557 if (!decoder)
00558 {
00559 decoder = new avfDecoder(file, this, input, output);
00560 }
00561 else
00562 {
00563 decoder->setInput(input);
00564 decoder->setOutput(output);
00565 }
00566
00567 return decoder;
00568 }
00569