OSDN Git Service

add support for wmav2(audio codec)
[android-x86/external-stagefright-plugins.git] / libstagefright / FFmpegExtractor / FFmpegExtractor.cpp
1 /*
2  * Copyright 2012 Michael Chen <omxcodec@gmail.com>
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #define LOG_NDEBUG 0
18 #define LOG_TAG "FFmpegExtractor"
19 #include <utils/Log.h>
20
21 #include <limits.h> /* INT_MAX */
22
23 #include <media/stagefright/foundation/ABitReader.h>
24 #include <media/stagefright/foundation/ABuffer.h>
25 #include <media/stagefright/foundation/ADebug.h>
26 #include <media/stagefright/foundation/AMessage.h>
27 #include <media/stagefright/foundation/hexdump.h>
28 #include <media/stagefright/DataSource.h>
29 #include <media/stagefright/MediaBuffer.h>
30 #include <media/stagefright/MediaDebug.h>
31 #include <media/stagefright/MediaDefs.h>
32 #include <media/stagefright/MediaErrors.h>
33 #include <media/stagefright/MediaSource.h>
34 #include <media/stagefright/MetaData.h>
35 #include <media/stagefright/Utils.h>
36 #include <utils/String8.h>
37 #include <utils/misc.h>
38
39 #include "include/avc_utils.h"
40 #include "ffmpeg_utils/ffmpeg_utils.h"
41 #include "FFmpegExtractor.h"
42
43 #define DEBUG_READ_ENTRY 0
44 #define DIABLE_VIDEO     0
45 #define DIABLE_AUDIO     0
46 #define WAIT_KEY_PACKET_AFTER_SEEK 1
47 #define DISABLE_NAL_TO_ANNEXB 0
48
49 #define MAX_QUEUE_SIZE (15 * 1024 * 1024)
50 #define MIN_AUDIOQ_SIZE (20 * 16 * 1024)
51 #define MIN_FRAMES 5
52 #define EXTRACTOR_MAX_PROBE_PACKETS 200
53
54 #define FF_MAX_EXTRADATA_SIZE ((1 << 28) - FF_INPUT_BUFFER_PADDING_SIZE)
55
56 enum {
57     NO_SEEK = 0,
58     SEEK,
59 };
60
61 static AVPacket flush_pkt;
62
63 namespace android {
64
65 struct FFmpegExtractor::Track : public MediaSource {
66     Track(const sp<FFmpegExtractor> &extractor, sp<MetaData> meta, bool isAVC,
67           AVStream *stream, PacketQueue *queue);
68
69     virtual status_t start(MetaData *params);
70     virtual status_t stop();
71     virtual sp<MetaData> getFormat();
72
73     virtual status_t read(
74             MediaBuffer **buffer, const ReadOptions *options);
75
76 protected:
77     virtual ~Track();
78
79 private:
80     friend struct FFmpegExtractor;
81
82     sp<FFmpegExtractor> mExtractor;
83     sp<MetaData> mMeta;
84
85     enum AVMediaType mMediaType;
86
87     mutable Mutex mLock;
88
89     bool mIsAVC;
90     size_t mNALLengthSize;
91     bool mNal2AnnexB;
92
93     AVStream *mStream;
94     PacketQueue *mQueue;
95
96     DISALLOW_EVIL_CONSTRUCTORS(Track);
97 };
98
99 ////////////////////////////////////////////////////////////////////////////////
100
101 FFmpegExtractor::FFmpegExtractor(const sp<DataSource> &source)
102     : mDataSource(source),
103       mReaderThreadStarted(false),
104       mInitCheck(NO_INIT) {
105     LOGV("FFmpegExtractor::FFmpegExtractor");
106
107     int err;
108     const char *url = mDataSource->getNamURI();
109     if (url == NULL) {
110         LOGI("url is error!");
111         return;
112     }
113     // is it right?
114     if (!strcmp(url, "-")) {
115         av_strlcpy(mFilename, "pipe:", strlen("pipe:") + 1);
116     } else {
117         av_strlcpy(mFilename, url, strlen(url) + 1);
118     }
119     LOGI("url: %s, mFilename: %s", url, mFilename);
120
121     err = initStreams();
122     if (err < 0) {
123         LOGE("failed to init ffmpeg");
124         return;
125     }
126
127     // start reader here, as we want to extract extradata from bitstream if no extradata
128     startReaderThread();
129
130     while(mProbePkts <= EXTRACTOR_MAX_PROBE_PACKETS && !mEOF &&
131         (mFormatCtx->pb ? !mFormatCtx->pb->error : 1) &&
132         (mDefersToCreateVideoTrack || mDefersToCreateAudioTrack)) {
133         // FIXME, i am so lazy! Should use pthread_cond_wait to wait conditions
134         SDL_Delay(5);
135     }
136
137     LOGV("mProbePkts: %d, mEOF: %d, pb->error(if has): %d, mDefersToCreateVideoTrack: %d, mDefersToCreateAudioTrack: %d",
138         mProbePkts, mEOF, mFormatCtx->pb ? mFormatCtx->pb->error : 0, mDefersToCreateVideoTrack, mDefersToCreateAudioTrack);
139
140     mInitCheck = OK;
141 }
142
143 FFmpegExtractor::~FFmpegExtractor() {
144     LOGV("FFmpegExtractor::~FFmpegExtractor");
145
146     // stop reader here if no track!
147     stopReaderThread();
148
149     deInitStreams();
150 }
151
152 size_t FFmpegExtractor::countTracks() {
153     return mInitCheck == OK ? mTracks.size() : 0;
154 }
155
156 sp<MediaSource> FFmpegExtractor::getTrack(size_t index) {
157     LOGV("FFmpegExtractor::getTrack[%d]", index);
158
159     if (mInitCheck != OK) {
160         return NULL;
161     }
162
163     if (index >= mTracks.size()) {
164         return NULL;
165     }
166
167     return mTracks.valueAt(index);
168 }
169
170 sp<MetaData> FFmpegExtractor::getTrackMetaData(size_t index, uint32_t flags) {
171     LOGV("FFmpegExtractor::getTrackMetaData[%d]", index);
172
173     if (mInitCheck != OK) {
174         return NULL;
175     }
176
177     if (index >= mTracks.size()) {
178         return NULL;
179     }
180
181     return mTracks.valueAt(index)->getFormat();
182 }
183
184 sp<MetaData> FFmpegExtractor::getMetaData() {
185     LOGV("FFmpegExtractor::getMetaData");
186
187     if (mInitCheck != OK) {
188         return NULL;
189     }
190
191     sp<MetaData> meta = new MetaData;
192     // TODO
193     meta->setCString(kKeyMIMEType, "video/ffmpeg");
194
195     return meta;
196 }
197
198 uint32_t FFmpegExtractor::flags() const {
199     LOGV("FFmpegExtractor::flags");
200
201     if (mInitCheck != OK) {
202         return NULL;
203     }
204
205     uint32_t flags = CAN_PAUSE;
206
207     if (mFormatCtx->duration != AV_NOPTS_VALUE) {
208         flags |= CAN_SEEK_BACKWARD | CAN_SEEK_FORWARD | CAN_SEEK;
209     }
210
211     return flags;
212 }
213
214 void FFmpegExtractor::packet_queue_init(PacketQueue *q)
215 {
216     memset(q, 0, sizeof(PacketQueue));
217     q->mutex = SDL_CreateMutex();
218     q->cond = SDL_CreateCond();
219     packet_queue_put(q, &flush_pkt);
220 }
221
222 void FFmpegExtractor::packet_queue_flush(PacketQueue *q)
223 {
224     AVPacketList *pkt, *pkt1;
225
226     SDL_LockMutex(q->mutex);
227     for (pkt = q->first_pkt; pkt != NULL; pkt = pkt1) {
228         pkt1 = pkt->next;
229         av_free_packet(&pkt->pkt);
230         av_freep(&pkt);
231     }
232     q->last_pkt = NULL;
233     q->first_pkt = NULL;
234     q->nb_packets = 0;
235     q->size = 0;
236     SDL_UnlockMutex(q->mutex);
237 }
238
239 void FFmpegExtractor::packet_queue_end(PacketQueue *q)
240 {
241     packet_queue_flush(q);
242     SDL_DestroyMutex(q->mutex);
243     SDL_DestroyCond(q->cond);
244 }
245
246 void FFmpegExtractor::packet_queue_abort(PacketQueue *q)
247 {
248     SDL_LockMutex(q->mutex);
249
250     q->abort_request = 1;
251
252     SDL_CondSignal(q->cond);
253
254     SDL_UnlockMutex(q->mutex);
255 }
256
257 int FFmpegExtractor::packet_queue_put(PacketQueue *q, AVPacket *pkt)
258 {
259     AVPacketList *pkt1;
260
261     /* duplicate the packet */
262     if (pkt != &flush_pkt && av_dup_packet(pkt) < 0)
263         return -1;
264
265     pkt1 = (AVPacketList *)av_malloc(sizeof(AVPacketList));
266     if (!pkt1)
267         return -1;
268     pkt1->pkt = *pkt;
269     pkt1->next = NULL;
270
271     SDL_LockMutex(q->mutex);
272
273     if (!q->last_pkt)
274
275         q->first_pkt = pkt1;
276     else
277         q->last_pkt->next = pkt1;
278     q->last_pkt = pkt1;
279     q->nb_packets++;
280     //q->size += pkt1->pkt.size + sizeof(*pkt1);
281     q->size += pkt1->pkt.size;
282     SDL_CondSignal(q->cond);
283
284     SDL_UnlockMutex(q->mutex);
285     return 0;
286 }
287
288 /* packet queue handling */
289 /* return < 0 if aborted, 0 if no packet and > 0 if packet.  */
290 int FFmpegExtractor::packet_queue_get(PacketQueue *q, AVPacket *pkt, int block)
291 {
292     AVPacketList *pkt1;
293     int ret;
294
295     SDL_LockMutex(q->mutex);
296
297     for (;;) {
298         if (q->abort_request) {
299             ret = -1;
300             break;
301         }
302
303         pkt1 = q->first_pkt;
304         if (pkt1) {
305             q->first_pkt = pkt1->next;
306             if (!q->first_pkt)
307                 q->last_pkt = NULL;
308             q->nb_packets--;
309             //q->size -= pkt1->pkt.size + sizeof(*pkt1);
310             q->size -= pkt1->pkt.size;
311             *pkt = pkt1->pkt;
312             av_free(pkt1);
313             ret = 1;
314             break;
315         } else if (!block) {
316             ret = 0;
317             break;
318         } else {
319             SDL_CondWait(q->cond, q->mutex);
320         }
321     }
322     SDL_UnlockMutex(q->mutex);
323     return ret;
324 }
325
326 static void EncodeSize14(uint8_t **_ptr, size_t size) {
327     CHECK_LE(size, 0x3fff);
328
329     uint8_t *ptr = *_ptr;
330
331     *ptr++ = 0x80 | (size >> 7);
332     *ptr++ = size & 0x7f;
333
334     *_ptr = ptr;
335 }
336
337 static sp<ABuffer> MakeMPEGVideoESDS(const sp<ABuffer> &csd) {
338     sp<ABuffer> esds = new ABuffer(csd->size() + 25);
339
340     uint8_t *ptr = esds->data();
341     *ptr++ = 0x03;
342     EncodeSize14(&ptr, 22 + csd->size());
343
344     *ptr++ = 0x00;  // ES_ID
345     *ptr++ = 0x00;
346
347     *ptr++ = 0x00;  // streamDependenceFlag, URL_Flag, OCRstreamFlag
348
349     *ptr++ = 0x04;
350     EncodeSize14(&ptr, 16 + csd->size());
351
352     *ptr++ = 0x40;  // Audio ISO/IEC 14496-3
353
354     for (size_t i = 0; i < 12; ++i) {
355         *ptr++ = 0x00;
356     }
357
358     *ptr++ = 0x05;
359     EncodeSize14(&ptr, csd->size());
360
361     memcpy(ptr, csd->data(), csd->size());
362
363     return esds;
364 }
365
366 // the same as MakeMPEGVideoESDS
367 static sp<ABuffer> MakeRawCodecSpecificData(const sp<ABuffer> &csd) {
368     sp<ABuffer> esds = new ABuffer(csd->size() + 25);
369
370     uint8_t *ptr = esds->data();
371     *ptr++ = 0x03;
372     EncodeSize14(&ptr, 22 + csd->size());
373
374     *ptr++ = 0x00;  // ES_ID
375     *ptr++ = 0x00;
376
377     *ptr++ = 0x00;  // streamDependenceFlag, URL_Flag, OCRstreamFlag
378
379     *ptr++ = 0x04;
380     EncodeSize14(&ptr, 16 + csd->size());
381
382     *ptr++ = 0x40;  // Audio ISO/IEC 14496-3
383
384     for (size_t i = 0; i < 12; ++i) {
385         *ptr++ = 0x00;
386     }
387
388     *ptr++ = 0x05;
389     EncodeSize14(&ptr, csd->size());
390
391     memcpy(ptr, csd->data(), csd->size());
392
393     return esds;
394 }
395
396 // Returns the sample rate based on the sampling frequency index
397 static uint32_t get_sample_rate(const uint8_t sf_index)
398 {
399     static const uint32_t sample_rates[] =
400     {
401         96000, 88200, 64000, 48000, 44100, 32000,
402         24000, 22050, 16000, 12000, 11025, 8000
403     };
404
405     if (sf_index < sizeof(sample_rates) / sizeof(sample_rates[0])) {
406         return sample_rates[sf_index];
407     }
408
409     return 0;
410 }
411
412 int FFmpegExtractor::check_extradata(AVCodecContext *avctx)
413 {
414     const char *name;
415     bool *defersToCreateTrack;
416     AVBitStreamFilterContext **bsfc;
417
418     // init
419     if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
420         bsfc = &mVideoBsfc;
421         defersToCreateTrack = &mDefersToCreateVideoTrack;
422     } else if (avctx->codec_type == AVMEDIA_TYPE_AUDIO){
423         bsfc = &mAudioBsfc;
424         defersToCreateTrack = &mDefersToCreateAudioTrack;
425     }
426
427     // ignore extradata
428     if (avctx->codec_id == CODEC_ID_MP3 ||
429             avctx->codec_id == CODEC_ID_MP1  ||
430             avctx->codec_id == CODEC_ID_MP2  ||
431             avctx->codec_id == CODEC_ID_AC3  ||
432             avctx->codec_id == CODEC_ID_H263  ||
433             avctx->codec_id == CODEC_ID_H263P ||
434             avctx->codec_id == CODEC_ID_H263I ||
435             avctx->codec_id == CODEC_ID_WMV1)
436         return 1;
437
438     // is extradata compatible with android?
439     if (avctx->codec_id != CODEC_ID_AAC) {
440         int is_compatible = is_extradata_compatible_with_android(avctx);
441         if (!is_compatible) {
442             LOGI("%s extradata is not compatible with android, should to extract it from bitstream",
443                     av_get_media_type_string(avctx->codec_type));
444             *defersToCreateTrack = true;
445             *bsfc = NULL; // H264 don't need bsfc, only AAC?
446             return 0;
447         }
448         return 1;
449     }
450
451     if (avctx->codec_id == CODEC_ID_AAC) {
452         name = "aac_adtstoasc";
453     }
454
455     if (avctx->extradata_size <= 0) {
456         LOGI("No %s extradata found, should to extract it from bitstream",
457                 av_get_media_type_string(avctx->codec_type));
458         *defersToCreateTrack = true;
459          //CHECK(name != NULL);
460         if (!*bsfc && name) {
461             *bsfc = av_bitstream_filter_init(name);
462             if (!*bsfc) {
463                 LOGE("Cannot open the %s BSF!", name);
464                 *defersToCreateTrack = false;
465                 return -1;
466             } else {
467                 LOGV("open the %s bsf", name);
468                 return 0;
469             }
470         } else {
471             return 0;
472         }
473     }
474     return 1;
475 }
476
477
478 int FFmpegExtractor::stream_component_open(int stream_index)
479 {
480     AVCodecContext *avctx;
481     sp<MetaData> meta;
482     bool isAVC = false;
483     bool supported = false;
484     uint32_t type;
485     const void *data;
486     size_t size;
487     int ret;
488
489     LOGI("stream_index: %d", stream_index);
490     if (stream_index < 0 || stream_index >= mFormatCtx->nb_streams)
491         return -1;
492     avctx = mFormatCtx->streams[stream_index]->codec;
493
494     switch(avctx->codec_id) {
495     case CODEC_ID_H264:
496     case CODEC_ID_MPEG4:
497     case CODEC_ID_H263:
498     case CODEC_ID_H263P:
499     case CODEC_ID_H263I:
500     case CODEC_ID_AAC:
501     case CODEC_ID_AC3:
502     case CODEC_ID_MP1:
503     case CODEC_ID_MP2:
504     case CODEC_ID_MP3:
505     case CODEC_ID_MPEG2VIDEO:
506     case CODEC_ID_WMV1:
507     case CODEC_ID_WMV2:
508     case CODEC_ID_WMAV2:
509 #if 0
510     case CODEC_ID_VC1:
511 #endif
512         supported = true;
513         break;
514     default:
515         supported = false;
516         break;
517     }
518
519     if (!supported) {
520         LOGE("unsupport the codec, id: 0x%0x", avctx->codec_id);
521         return -1;
522     }
523     LOGV("support the codec");
524
525     unsigned streamType;
526     ssize_t index = mTracks.indexOfKey(stream_index);
527
528     if (index >= 0) {
529         LOGE("this track already exists");
530         return 0;
531     }
532
533     mFormatCtx->streams[stream_index]->discard = AVDISCARD_DEFAULT;
534
535     char tagbuf[32];
536     av_get_codec_tag_string(tagbuf, sizeof(tagbuf), avctx->codec_tag);
537     LOGV("Tag %s/0x%08x with codec id '%d'\n", tagbuf, avctx->codec_tag, avctx->codec_id);
538
539     switch (avctx->codec_type) {
540     case AVMEDIA_TYPE_VIDEO:
541         if (mVideoStreamIdx == -1)
542             mVideoStreamIdx = stream_index;
543         if (mVideoStream == NULL)
544             mVideoStream = mFormatCtx->streams[stream_index];
545         if (!mVideoQInited) {
546             packet_queue_init(&mVideoQ);
547             mVideoQInited = true;
548         }
549
550         ret = check_extradata(avctx);
551         if (ret != 1) {
552             if (ret == -1) {
553                 // disable the stream
554                 mVideoStreamIdx = -1;
555                 mVideoStream = NULL;
556                 packet_queue_end(&mVideoQ);
557                 mVideoQInited =  false;
558                 mFormatCtx->streams[stream_index]->discard = AVDISCARD_ALL;
559             }
560             return ret;
561          }
562
563         if (avctx->extradata) {
564             LOGV("video stream extradata:");
565             hexdump(avctx->extradata, avctx->extradata_size);
566         } else {
567             LOGV("video stream no extradata, but we can ignore it.");
568         }
569
570         meta = new MetaData;
571
572         switch(avctx->codec_id) {
573         case CODEC_ID_H264:
574             /**
575              * H.264 Video Types
576              * http://msdn.microsoft.com/en-us/library/dd757808(v=vs.85).aspx
577              */
578             //if (avctx->codec_tag && avctx->codec_tag == AV_RL32("avc1")) {
579             if (avctx->extradata[0] == 1 /* configurationVersion */) {
580                 // H.264 bitstream without start codes.
581                 isAVC = true;
582                 LOGV("AVC");
583
584                 if (avctx->width == 0 || avctx->height == 0) {
585                     int32_t width, height;
586                     sp<ABuffer> seqParamSet = new ABuffer(avctx->extradata_size - 8);
587                     memcpy(seqParamSet->data(), avctx->extradata + 8, avctx->extradata_size - 8);
588                     FindAVCDimensions(seqParamSet, &width, &height);
589                     avctx->width  = width;
590                     avctx->height = height;
591                 }
592
593                 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC);
594                 meta->setData(kKeyAVCC, kTypeAVCC, avctx->extradata, avctx->extradata_size);
595             } else {
596                 // H.264 bitstream with start codes.
597                 isAVC = false;
598                 LOGV("H264");
599
600                 /* set NULL to release meta as we will new a meta in MakeAVCCodecSpecificData() fxn */
601                 meta->clear();
602                 meta = NULL;
603
604                 sp<ABuffer> buffer = new ABuffer(avctx->extradata_size);
605                 memcpy(buffer->data(), avctx->extradata, avctx->extradata_size);
606                 meta = MakeAVCCodecSpecificData(buffer);
607             }
608             break;
609         case CODEC_ID_MPEG4:
610             LOGV("MPEG4");
611             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_MPEG4);
612             {
613                 sp<ABuffer> csd = new ABuffer(avctx->extradata_size);
614                 memcpy(csd->data(), avctx->extradata, avctx->extradata_size);
615                 sp<ABuffer> esds = MakeMPEGVideoESDS(csd);
616                 meta->setData(kKeyESDS, kTypeESDS, esds->data(), esds->size());
617             }
618             break;
619         case CODEC_ID_H263:
620         case CODEC_ID_H263P:
621         case CODEC_ID_H263I:
622             LOGV("H263");
623             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_H263);
624             break;
625         case CODEC_ID_MPEG2VIDEO:
626             LOGV("MPEG2VIDEO");
627             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_MPEG2);
628             {
629                 sp<ABuffer> csd = new ABuffer(avctx->extradata_size);
630                 memcpy(csd->data(), avctx->extradata, avctx->extradata_size);
631                 sp<ABuffer> esds = MakeMPEGVideoESDS(csd);
632                 meta->setData(kKeyESDS, kTypeESDS, esds->data(), esds->size());
633             }
634             break;
635         case CODEC_ID_VC1:
636             LOGV("VC1");
637             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_WMV12);
638             meta->setData(kKeyESDS, kTypeESDS, avctx->extradata, avctx->extradata_size);
639             break;
640         case CODEC_ID_WMV1:
641             LOGV("WMV1");
642             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_WMV12);
643             break;
644         case CODEC_ID_WMV2:
645             LOGV("WMV2");
646             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_WMV12);
647             {
648                 sp<ABuffer> csd = new ABuffer(avctx->extradata_size);
649                 memcpy(csd->data(), avctx->extradata, avctx->extradata_size);
650                 sp<ABuffer> esds = MakeRawCodecSpecificData(csd);
651                 meta->setData(kKeyESDS, kTypeESDS, esds->data(), esds->size());
652             }
653             break;
654         default:
655             CHECK(!"Should not be here. Unsupported codec.");
656             break;
657         }
658
659         LOGI("width: %d, height: %d, bit_rate: %d", avctx->width, avctx->height, avctx->bit_rate);
660
661         meta->setInt32(kKeyWidth, avctx->width);
662         meta->setInt32(kKeyHeight, avctx->height);
663         if (avctx->bit_rate > 0)
664             meta->setInt32(kKeyBitRate, avctx->bit_rate);
665         if (mFormatCtx->duration != AV_NOPTS_VALUE)
666             meta->setInt64(kKeyDuration, mFormatCtx->duration);
667
668         LOGV("create a video track");
669         index = mTracks.add(
670             stream_index, new Track(this, meta, isAVC, mVideoStream, &mVideoQ));
671
672         mDefersToCreateVideoTrack = false;
673
674         break;
675     case AVMEDIA_TYPE_AUDIO:
676         if (mAudioStreamIdx == -1)
677             mAudioStreamIdx = stream_index;
678         if (mAudioStream == NULL)
679             mAudioStream = mFormatCtx->streams[stream_index];
680         if (!mAudioQInited) {
681             packet_queue_init(&mAudioQ);
682             mAudioQInited = true;
683         }
684
685         ret = check_extradata(avctx);
686         if (ret != 1) {
687             if (ret == -1) {
688                 // disable the stream
689                 mAudioStreamIdx = -1;
690                 mAudioStream = NULL;
691                 packet_queue_end(&mAudioQ);
692                 mAudioQInited =  false;
693                 mFormatCtx->streams[stream_index]->discard = AVDISCARD_ALL;
694             }
695             return ret;
696         }
697
698         if (avctx->extradata) {
699             LOGV("audio stream extradata:");
700             hexdump(avctx->extradata, avctx->extradata_size);
701         } else {
702             LOGV("audio stream no extradata, but we can ignore it.");
703         }
704
705         switch(avctx->codec_id) {
706         case CODEC_ID_MP1:
707             LOGV("MP1");
708             meta = new MetaData;
709             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_I);
710             break;
711         case CODEC_ID_MP2:
712             LOGV("MP2");
713             meta = new MetaData;
714             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_II);
715             break;
716         case CODEC_ID_MP3:
717             LOGV("MP3");
718             meta = new MetaData;
719             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_MPEG);
720             break;
721         case CODEC_ID_AC3:
722             LOGV("AC3");
723             meta = new MetaData;
724             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AC3);
725             break;
726         case CODEC_ID_AAC:
727             LOGV("AAC"); 
728             uint32_t sr;
729             const uint8_t *header;
730             uint8_t profile, sf_index, channel;
731
732             header = avctx->extradata;
733             CHECK(header != NULL);
734
735             // AudioSpecificInfo follows
736             // oooo offf fccc c000
737             // o - audioObjectType
738             // f - samplingFreqIndex
739             // c - channelConfig
740             profile = ((header[0] & 0xf8) >> 3) - 1;
741             sf_index = (header[0] & 0x07) << 1 | (header[1] & 0x80) >> 7;
742             sr = get_sample_rate(sf_index);
743             if (sr == 0) {
744                 LOGE("unsupport the sample rate");
745                 return -1;
746             }
747             channel = (header[1] >> 3) & 0xf;
748             LOGV("profile: %d, sf_index: %d, channel: %d", profile, sf_index, channel);
749
750             meta = MakeAACCodecSpecificData(profile, sf_index, channel);
751             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AAC);
752             break;
753         case CODEC_ID_WMAV2:
754             LOGV("WMAV2");
755             meta = new MetaData;
756             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_WMA);
757             {
758                 sp<ABuffer> csd = new ABuffer(avctx->extradata_size);
759                 memcpy(csd->data(), avctx->extradata, avctx->extradata_size);
760                 sp<ABuffer> esds = MakeRawCodecSpecificData(csd);
761                 meta->setData(kKeyESDS, kTypeESDS, esds->data(), esds->size());
762             }
763             break;
764         default:
765             CHECK(!"Should not be here. Unsupported codec.");
766             break;
767         }
768
769         LOGI("bit_rate: %d, sample_rate: %d, channels: %d", avctx->bit_rate, avctx->sample_rate, avctx->channels);
770
771         meta->setInt32(kKeySampleRate, avctx->sample_rate);
772         meta->setInt32(kKeyChannelCount, avctx->channels);
773         meta->setInt32(kKeyBitRate, avctx->bit_rate);
774         if (mFormatCtx->duration != AV_NOPTS_VALUE)
775             meta->setInt64(kKeyDuration, mFormatCtx->duration);
776
777         if (avctx->codec_id != CODEC_ID_MP3 &&
778                 avctx->codec_id != CODEC_ID_MP1 &&
779                 avctx->codec_id != CODEC_ID_MP2 &&
780                 avctx->codec_id != CODEC_ID_AC3) {
781             LOGV("audio meta esds:");
782             CHECK(meta->findData(kKeyESDS, &type, &data, &size));
783             hexdump(data, size);
784         }
785
786         LOGV("create a audio track");
787         index = mTracks.add(
788             stream_index, new Track(this, meta, false, mAudioStream, &mAudioQ));
789
790         mDefersToCreateAudioTrack = false;
791
792         break;
793     case AVMEDIA_TYPE_SUBTITLE:
794         /* Unsupport now */
795         CHECK(!"Should not be here. Unsupported media type.");
796         break;
797     default:
798         CHECK(!"Should not be here. Unsupported media type.");
799         break;
800     }
801     return 0;
802 }
803
804 void FFmpegExtractor::stream_component_close(int stream_index)
805 {
806     AVCodecContext *avctx;
807
808     if (stream_index < 0 || stream_index >= mFormatCtx->nb_streams)
809         return;
810     avctx = mFormatCtx->streams[stream_index]->codec;
811
812     switch (avctx->codec_type) {
813     case AVMEDIA_TYPE_VIDEO:
814         LOGV("packet_queue_abort videoq");
815         packet_queue_abort(&mVideoQ);
816         /* wait until the end */
817         while (!mAbortRequest && !mVideoEOSReceived) {
818             LOGV("wait for video received");
819             SDL_Delay(10);
820         }
821         LOGV("packet_queue_end videoq");
822         packet_queue_end(&mVideoQ);
823         break;
824     case AVMEDIA_TYPE_AUDIO:
825         LOGV("packet_queue_abort audioq");
826         packet_queue_abort(&mAudioQ);
827         while (!mAbortRequest && !mAudioEOSReceived) {
828             LOGV("wait for audio received");
829             SDL_Delay(10);
830         }
831         LOGV("packet_queue_end audioq");
832         packet_queue_end(&mAudioQ);
833         break;
834     case AVMEDIA_TYPE_SUBTITLE:
835         break;
836     default:
837         break;
838     }
839
840     mFormatCtx->streams[stream_index]->discard = AVDISCARD_ALL;
841     switch (avctx->codec_type) {
842     case AVMEDIA_TYPE_VIDEO:
843         mVideoStream    = NULL;
844         mVideoStreamIdx = -1;
845         if (mVideoBsfc) {
846             av_bitstream_filter_close(mVideoBsfc);
847             mVideoBsfc  = NULL;
848         }
849         break;
850     case AVMEDIA_TYPE_AUDIO:
851         mAudioStream    = NULL;
852         mAudioStreamIdx = -1;
853         if (mAudioBsfc) {
854             av_bitstream_filter_close(mAudioBsfc);
855             mAudioBsfc  = NULL;
856         }
857         break;
858     case AVMEDIA_TYPE_SUBTITLE:
859         break;
860     default:
861         break;
862     }
863 }
864
865 void FFmpegExtractor::reachedEOS(enum AVMediaType media_type)
866 {
867     Mutex::Autolock autoLock(mLock);
868
869     if (media_type == AVMEDIA_TYPE_VIDEO) {
870         mVideoEOSReceived = true;
871     } else if (media_type == AVMEDIA_TYPE_AUDIO) {
872         mAudioEOSReceived = true;
873     }
874 }
875
876 /* seek in the stream */
877 int FFmpegExtractor::stream_seek(int64_t pos, enum AVMediaType media_type)
878 {
879     Mutex::Autolock autoLock(mLock);
880
881     if (mVideoStreamIdx >= 0 &&
882         mAudioStreamIdx >= 0 &&
883         media_type == AVMEDIA_TYPE_AUDIO &&
884         !mVideoEOSReceived) {
885        return NO_SEEK;
886     }
887
888     // flush immediately
889     if (mAudioStreamIdx >= 0)
890         packet_queue_flush(&mAudioQ);
891     if (mVideoStreamIdx >= 0)
892         packet_queue_flush(&mVideoQ);
893
894     mSeekPos = pos;
895     mSeekFlags &= ~AVSEEK_FLAG_BYTE;
896     mSeekReq = 1;
897
898     return SEEK;
899 }
900
901 // staitc
902 int FFmpegExtractor::decode_interrupt_cb(void *ctx)
903 {
904     FFmpegExtractor *extrator = static_cast<FFmpegExtractor *>(ctx);
905     return extrator->mAbortRequest;
906 }
907
908 void FFmpegExtractor::print_error_ex(const char *filename, int err)
909 {
910     char errbuf[128];
911     const char *errbuf_ptr = errbuf;
912
913     if (av_strerror(err, errbuf, sizeof(errbuf)) < 0)
914         errbuf_ptr = strerror(AVUNERROR(err));
915     LOGI("%s: %s\n", filename, errbuf_ptr);
916 }
917
918 void FFmpegExtractor::setFFmpegDefaultOpts()
919 {
920     mGenPTS       = 0;
921 #if DIABLE_VIDEO
922     mVideoDisable = 1;
923 #else
924     mVideoDisable = 0;
925 #endif
926 #if DIABLE_AUDIO
927     mAudioDisable = 1;
928 #else
929     mAudioDisable = 0;
930 #endif
931     mShowStatus   = 1;
932     mSeekByBytes  = 0; /* seek by bytes 0=off 1=on -1=auto" */
933     mStartTime    = AV_NOPTS_VALUE;
934     mDuration     = AV_NOPTS_VALUE;
935     mSeekPos      = AV_NOPTS_VALUE;
936     mAutoExit     = 1;
937     mLoop         = 1;
938
939     mVideoStreamIdx = -1;
940     mAudioStreamIdx = -1;
941     mVideoStream  = NULL;
942     mAudioStream  = NULL;
943     mVideoQInited = false;
944     mAudioQInited = false;
945     mDefersToCreateVideoTrack = false;
946     mDefersToCreateAudioTrack = false;
947     mVideoBsfc = NULL;
948     mAudioBsfc = NULL;
949
950     mAbortRequest = 0;
951     mPaused       = 0;
952     mLastPaused   = 0;
953     mSeekReq      = 0;
954
955     mProbePkts    = 0;
956     mEOF          = false;
957 }
958
959 int FFmpegExtractor::initStreams()
960 {
961     int err, i;
962     status_t status;
963     int eof = 0;
964     int ret = 0, audio_ret = 0, video_ret = 0;
965     int pkt_in_play_range = 0;
966     AVDictionaryEntry *t;
967     AVDictionary **opts;
968     int orig_nb_streams;
969     int st_index[AVMEDIA_TYPE_NB] = {0};
970     int wanted_stream[AVMEDIA_TYPE_NB] = {0};
971     st_index[AVMEDIA_TYPE_AUDIO]  = -1;
972     st_index[AVMEDIA_TYPE_VIDEO]  = -1;
973     wanted_stream[AVMEDIA_TYPE_AUDIO]  = -1;
974     wanted_stream[AVMEDIA_TYPE_VIDEO]  = -1;
975
976     setFFmpegDefaultOpts();
977
978     status = initFFmpeg();
979     if (status != OK) {
980         ret = -1;
981         goto fail;
982     }
983
984     av_init_packet(&flush_pkt);
985     flush_pkt.data = (uint8_t *)"FLUSH";
986     flush_pkt.size = 0;
987
988     mFormatCtx = avformat_alloc_context();
989     mFormatCtx->interrupt_callback.callback = decode_interrupt_cb;
990     mFormatCtx->interrupt_callback.opaque = this;
991     LOGV("mFilename: %s", mFilename);
992     err = avformat_open_input(&mFormatCtx, mFilename, NULL, &format_opts);
993     if (err < 0) {
994         print_error_ex(mFilename, err);
995         ret = -1;
996         goto fail;
997     }
998     if ((t = av_dict_get(format_opts, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
999         LOGE("Option %s not found.\n", t->key);
1000         //ret = AVERROR_OPTION_NOT_FOUND;
1001         ret = -1;
1002         goto fail;
1003     }
1004
1005     if (mGenPTS)
1006         mFormatCtx->flags |= AVFMT_FLAG_GENPTS;
1007
1008     opts = setup_find_stream_info_opts(mFormatCtx, codec_opts);
1009     orig_nb_streams = mFormatCtx->nb_streams;
1010
1011     err = avformat_find_stream_info(mFormatCtx, opts);
1012     if (err < 0) {
1013         LOGE("%s: could not find codec parameters\n", mFilename);
1014         ret = -1;
1015         goto fail;
1016     }
1017     for (i = 0; i < orig_nb_streams; i++)
1018         av_dict_free(&opts[i]);
1019     av_freep(&opts);
1020
1021     if (mFormatCtx->pb)
1022         mFormatCtx->pb->eof_reached = 0; // FIXME hack, ffplay maybe should not use url_feof() to test for the end
1023
1024     if (mSeekByBytes < 0)
1025         mSeekByBytes = !!(mFormatCtx->iformat->flags & AVFMT_TS_DISCONT);
1026
1027     /* if seeking requested, we execute it */
1028     if (mStartTime != AV_NOPTS_VALUE) {
1029         int64_t timestamp;
1030
1031         timestamp = mStartTime;
1032         /* add the stream start time */
1033         if (mFormatCtx->start_time != AV_NOPTS_VALUE)
1034             timestamp += mFormatCtx->start_time;
1035         ret = avformat_seek_file(mFormatCtx, -1, INT64_MIN, timestamp, INT64_MAX, 0);
1036         if (ret < 0) {
1037             LOGE("%s: could not seek to position %0.3f",
1038                     mFilename, (double)timestamp / AV_TIME_BASE);
1039             goto fail;
1040         }
1041     }
1042
1043     for (i = 0; i < mFormatCtx->nb_streams; i++)
1044         mFormatCtx->streams[i]->discard = AVDISCARD_ALL;
1045     if (!mVideoDisable)
1046         st_index[AVMEDIA_TYPE_VIDEO] =
1047             av_find_best_stream(mFormatCtx, AVMEDIA_TYPE_VIDEO,
1048                                 wanted_stream[AVMEDIA_TYPE_VIDEO], -1, NULL, 0);
1049     if (!mAudioDisable)
1050         st_index[AVMEDIA_TYPE_AUDIO] =
1051             av_find_best_stream(mFormatCtx, AVMEDIA_TYPE_AUDIO,
1052                                 wanted_stream[AVMEDIA_TYPE_AUDIO],
1053                                 st_index[AVMEDIA_TYPE_VIDEO],
1054                                 NULL, 0);
1055     if (mShowStatus) {
1056         av_dump_format(mFormatCtx, 0, mFilename, 0);
1057     }
1058
1059     if (mFormatCtx->duration != AV_NOPTS_VALUE) {
1060         int hours, mins, secs, us;
1061         secs = mFormatCtx->duration / AV_TIME_BASE;
1062         us = mFormatCtx->duration % AV_TIME_BASE;
1063         mins = secs / 60;
1064         secs %= 60;
1065         hours = mins / 60;
1066         mins %= 60;
1067         LOGI("the duration is %02d:%02d:%02d.%02d", hours, mins, secs, (100 * us) / AV_TIME_BASE);
1068     }
1069
1070     if (st_index[AVMEDIA_TYPE_AUDIO] >= 0) {
1071         audio_ret = stream_component_open(st_index[AVMEDIA_TYPE_AUDIO]);
1072     }
1073
1074     if (st_index[AVMEDIA_TYPE_VIDEO] >= 0) {
1075         video_ret = stream_component_open(st_index[AVMEDIA_TYPE_VIDEO]);
1076     }
1077
1078     if ( audio_ret < 0 && video_ret < 0) {
1079         LOGE("%s: could not open codecs\n", mFilename);
1080         ret = -1;
1081         goto fail;
1082     }
1083
1084     ret = 0;
1085
1086 fail:
1087     return ret;
1088 }
1089
1090 void FFmpegExtractor::deInitStreams()
1091 {
1092     if (mFormatCtx) {
1093         avformat_close_input(&mFormatCtx);
1094     }
1095
1096     deInitFFmpeg();
1097 }
1098
1099 status_t FFmpegExtractor::startReaderThread() {
1100     LOGV("Starting reader thread");
1101     Mutex::Autolock autoLock(mLock);
1102
1103     if (mReaderThreadStarted)
1104         return OK;
1105
1106     pthread_attr_t attr;
1107     pthread_attr_init(&attr);
1108     pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
1109     pthread_create(&mReaderThread, &attr, ReaderWrapper, this);
1110     pthread_attr_destroy(&attr);
1111     mReaderThreadStarted = true;
1112     LOGD("Reader thread started");
1113
1114     return OK;
1115 }
1116
1117 void FFmpegExtractor::stopReaderThread() {
1118     LOGV("Stopping reader thread");
1119     Mutex::Autolock autoLock(mLock);
1120
1121     if (!mReaderThreadStarted) {
1122         LOGD("Reader thread have been stopped");
1123         return;
1124     }
1125
1126     mAbortRequest = 1;
1127
1128     void *dummy;
1129     pthread_join(mReaderThread, &dummy);
1130     mReaderThreadStarted = false;
1131     LOGD("Reader thread stopped");
1132 }
1133
1134 // static
1135 void *FFmpegExtractor::ReaderWrapper(void *me) {
1136     ((FFmpegExtractor *)me)->readerEntry();
1137
1138     return NULL;
1139 }
1140
1141 void FFmpegExtractor::readerEntry() {
1142     int err, i, ret;
1143     AVPacket pkt1, *pkt = &pkt1;
1144     int eof = 0;
1145     int pkt_in_play_range = 0;
1146
1147     LOGV("FFmpegExtractor::readerEntry");
1148
1149     mVideoEOSReceived = false;
1150     mAudioEOSReceived = false;
1151
1152     for (;;) {
1153         if (mAbortRequest)
1154             break;
1155
1156         if (mPaused != mLastPaused) {
1157             mLastPaused = mPaused;
1158             if (mPaused)
1159                 mReadPauseReturn = av_read_pause(mFormatCtx);
1160             else
1161                 av_read_play(mFormatCtx);
1162         }
1163 #if CONFIG_RTSP_DEMUXER || CONFIG_MMSH_PROTOCOL
1164         if (mPaused &&
1165                 (!strcmp(mFormatCtx->iformat->name, "rtsp") ||
1166                  (mFormatCtx->pb && !strncmp(mFilename, "mmsh:", 5)))) {
1167             /* wait 10 ms to avoid trying to get another packet */
1168             /* XXX: horrible */
1169             SDL_Delay(10);
1170             continue;
1171         }
1172 #endif
1173
1174         if (mSeekReq) {
1175             LOGV("readerEntry, mSeekReq: %d", mSeekReq);
1176             ret = avformat_seek_file(mFormatCtx, -1, INT64_MIN, mSeekPos, INT64_MAX, mSeekFlags);
1177             if (ret < 0) {
1178                 LOGE("%s: error while seeking", mFormatCtx->filename);
1179             } else {
1180                 if (mAudioStreamIdx >= 0) {
1181                     packet_queue_flush(&mAudioQ);
1182                     packet_queue_put(&mAudioQ, &flush_pkt);
1183                 }
1184                 if (mVideoStreamIdx >= 0) {
1185                     packet_queue_flush(&mVideoQ);
1186                     packet_queue_put(&mVideoQ, &flush_pkt);
1187                 }
1188             }
1189             mSeekReq = 0;
1190             eof = 0;
1191         }
1192
1193         /* if the queue are full, no need to read more */
1194         if (   mAudioQ.size + mVideoQ.size > MAX_QUEUE_SIZE
1195             || (   (mAudioQ   .size  > MIN_AUDIOQ_SIZE || mAudioStreamIdx < 0)
1196                 && (mVideoQ   .nb_packets > MIN_FRAMES || mVideoStreamIdx < 0))) {
1197 #if DEBUG_READ_ENTRY
1198             LOGV("readerEntry, is full, fuck");
1199 #endif
1200             /* wait 10 ms */
1201             SDL_Delay(10);
1202             continue;
1203         }
1204
1205         if (eof) {
1206             if (mVideoStreamIdx >= 0) {
1207                 av_init_packet(pkt);
1208                 pkt->data = NULL;
1209                 pkt->size = 0;
1210                 pkt->stream_index = mVideoStreamIdx;
1211                 packet_queue_put(&mVideoQ, pkt);
1212             }
1213             if (mAudioStreamIdx >= 0) {
1214                 av_init_packet(pkt);
1215                 pkt->data = NULL;
1216                 pkt->size = 0;
1217                 pkt->stream_index = mAudioStreamIdx;
1218                 packet_queue_put(&mAudioQ, pkt);
1219             }
1220             SDL_Delay(10);
1221 #if DEBUG_READ_ENTRY
1222             LOGV("readerEntry, eof = 1, mVideoQ.size: %d, mVideoQ.nb_packets: %d, mAudioQ.size: %d, mAudioQ.nb_packets: %d",
1223                     mVideoQ.size, mVideoQ.nb_packets, mAudioQ.size, mAudioQ.nb_packets);
1224 #endif
1225             if (mAudioQ.size + mVideoQ.size  == 0) {
1226                 if (mLoop != 1 && (!mLoop || --mLoop)) {
1227                     if (mVideoStreamIdx >= 0) {
1228                         stream_seek(mStartTime != AV_NOPTS_VALUE ? mStartTime : 0, AVMEDIA_TYPE_VIDEO);
1229                     } else if (mAudioStreamIdx >= 0) {
1230                         stream_seek(mStartTime != AV_NOPTS_VALUE ? mStartTime : 0, AVMEDIA_TYPE_AUDIO);
1231                     }
1232                 } else if (mAutoExit) {
1233                     ret = AVERROR_EOF;
1234                     goto fail;
1235                 }
1236             }
1237             eof=0;
1238             continue;
1239         }
1240
1241         ret = av_read_frame(mFormatCtx, pkt);
1242         mProbePkts++;
1243         if (ret < 0) {
1244             if (ret == AVERROR_EOF || url_feof(mFormatCtx->pb))
1245                 if (ret == AVERROR_EOF) {
1246                     //LOGV("ret == AVERROR_EOF");
1247                 }
1248                 if (url_feof(mFormatCtx->pb)) {
1249                     //LOGV("url_feof(mFormatCtx->pb)");
1250                 }
1251
1252                 eof = 1;
1253                 mEOF = true;
1254             if (mFormatCtx->pb && mFormatCtx->pb->error) {
1255                 LOGE("mFormatCtx->pb->error: %d", mFormatCtx->pb->error);
1256                 break;
1257             }
1258             SDL_Delay(100);
1259             continue;
1260         }
1261
1262         if (pkt->stream_index == mVideoStreamIdx) {
1263              if (mDefersToCreateVideoTrack) {
1264                 AVCodecContext *avctx = mFormatCtx->streams[mVideoStreamIdx]->codec;
1265
1266                 int i = parser_split(avctx, pkt->data, pkt->size);
1267                 if (i > 0 && i < FF_MAX_EXTRADATA_SIZE) {
1268                     if (avctx->extradata)
1269                         av_freep(&avctx->extradata);
1270                     avctx->extradata_size= i;
1271                     avctx->extradata = (uint8_t *)av_malloc(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
1272                     if (!avctx->extradata) {
1273                         //return AVERROR(ENOMEM);
1274                         ret = AVERROR(ENOMEM);
1275                         goto fail;
1276                     }
1277                     // sps + pps(there may be sei in it)
1278                     memcpy(avctx->extradata, pkt->data, avctx->extradata_size);
1279                     memset(avctx->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
1280                 } else {
1281                     av_free_packet(pkt);
1282                     continue;
1283                 }
1284
1285                 stream_component_open(mVideoStreamIdx);
1286                 if (!mDefersToCreateVideoTrack)
1287                     LOGI("probe packet counter: %d when create video track ok", mProbePkts);
1288                 if (mProbePkts == EXTRACTOR_MAX_PROBE_PACKETS)
1289                     LOGI("probe packet counter to max: %d, create video track: %d",
1290                         mProbePkts, !mDefersToCreateVideoTrack);
1291             }
1292         } else if (pkt->stream_index == mAudioStreamIdx) {
1293             int ret;
1294             uint8_t *outbuf;
1295             int   outbuf_size;
1296             AVCodecContext *avctx = mFormatCtx->streams[mAudioStreamIdx]->codec;
1297             if (mAudioBsfc && pkt && pkt->data) {
1298                 ret = av_bitstream_filter_filter(mAudioBsfc, avctx, NULL, &outbuf, &outbuf_size,
1299                                    pkt->data, pkt->size, pkt->flags & AV_PKT_FLAG_KEY);
1300
1301                 if (ret < 0 ||!outbuf_size) {
1302                     av_free_packet(pkt);
1303                     continue;
1304                 }
1305                 if (outbuf && outbuf != pkt->data) {
1306                     memmove(pkt->data, outbuf, outbuf_size);
1307                     pkt->size = outbuf_size;
1308                 }
1309             }
1310             if (mDefersToCreateAudioTrack) {
1311                 if (avctx->extradata_size <= 0) {
1312                     av_free_packet(pkt);
1313                     continue;
1314                 }
1315                 stream_component_open(mAudioStreamIdx);
1316                 if (!mDefersToCreateAudioTrack)
1317                     LOGI("probe packet counter: %d when create audio track ok", mProbePkts);
1318                 if (mProbePkts == EXTRACTOR_MAX_PROBE_PACKETS)
1319                     LOGI("probe packet counter to max: %d, create audio track: %d",
1320                         mProbePkts, !mDefersToCreateAudioTrack);
1321             }
1322         }
1323
1324         /* check if packet is in play range specified by user, then queue, otherwise discard */
1325         pkt_in_play_range = mDuration == AV_NOPTS_VALUE ||
1326                 (pkt->pts - mFormatCtx->streams[pkt->stream_index]->start_time) *
1327                 av_q2d(mFormatCtx->streams[pkt->stream_index]->time_base) -
1328                 (double)(mStartTime != AV_NOPTS_VALUE ? mStartTime : 0) / 1000000
1329                 <= ((double)mDuration / 1000000);
1330         if (pkt->stream_index == mAudioStreamIdx && pkt_in_play_range) {
1331             packet_queue_put(&mAudioQ, pkt);
1332         } else if (pkt->stream_index == mVideoStreamIdx && pkt_in_play_range) {
1333             packet_queue_put(&mVideoQ, pkt);
1334         } else {
1335             av_free_packet(pkt);
1336         }
1337     }
1338     /* wait until the end */
1339     while (!mAbortRequest) {
1340         SDL_Delay(100);
1341     }
1342
1343     ret = 0;
1344 fail:
1345     LOGI("reader thread goto end...");
1346
1347     /* close each stream */
1348     if (mAudioStreamIdx >= 0)
1349         stream_component_close(mAudioStreamIdx);
1350     if (mVideoStreamIdx >= 0)
1351         stream_component_close(mVideoStreamIdx);
1352     if (mFormatCtx) {
1353         avformat_close_input(&mFormatCtx);
1354     }
1355 }
1356
1357 ////////////////////////////////////////////////////////////////////////////////
1358
1359 FFmpegExtractor::Track::Track(
1360         const sp<FFmpegExtractor> &extractor, sp<MetaData> meta, bool isAVC,
1361           AVStream *stream, PacketQueue *queue)
1362     : mExtractor(extractor),
1363       mMeta(meta),
1364       mIsAVC(isAVC),
1365       mStream(stream),
1366       mQueue(queue) {
1367     const char *mime;
1368
1369     /* H.264 Video Types */
1370     {
1371         mNal2AnnexB = false;
1372
1373         if (mIsAVC) {
1374             uint32_t type;
1375             const void *data;
1376             size_t size;
1377             CHECK(meta->findData(kKeyAVCC, &type, &data, &size));
1378
1379             const uint8_t *ptr = (const uint8_t *)data;
1380
1381             CHECK(size >= 7);
1382             CHECK_EQ((unsigned)ptr[0], 1u);  // configurationVersion == 1
1383
1384             // The number of bytes used to encode the length of a NAL unit.
1385             mNALLengthSize = 1 + (ptr[4] & 3);
1386
1387             LOGV("the stream is AVC, the length of a NAL unit: %d", mNALLengthSize);
1388
1389             mNal2AnnexB = true;
1390         }
1391     }
1392
1393     mMediaType = mStream->codec->codec_type;
1394 }
1395
1396 FFmpegExtractor::Track::~Track() {
1397 }
1398
1399 status_t FFmpegExtractor::Track::start(MetaData *params) {
1400     Mutex::Autolock autoLock(mLock);
1401     //mExtractor->startReaderThread();
1402     return OK;
1403 }
1404
1405 status_t FFmpegExtractor::Track::stop() {
1406     Mutex::Autolock autoLock(mLock);
1407     mExtractor->stopReaderThread();
1408     return OK;
1409 }
1410
1411 sp<MetaData> FFmpegExtractor::Track::getFormat() {
1412     Mutex::Autolock autoLock(mLock);
1413
1414     return mMeta;
1415 }
1416
1417 status_t FFmpegExtractor::Track::read(
1418         MediaBuffer **buffer, const ReadOptions *options) {
1419     *buffer = NULL;
1420
1421     Mutex::Autolock autoLock(mLock);
1422
1423     AVPacket pkt;
1424     bool seeking = false;
1425     bool waitKeyPkt = false;
1426     ReadOptions::SeekMode mode;
1427     int64_t pktTS = AV_NOPTS_VALUE;
1428     int64_t seekTimeUs = AV_NOPTS_VALUE;
1429     int64_t timeUs;
1430     int key;
1431     status_t status = OK;
1432
1433     if (options && options->getSeekTo(&seekTimeUs, &mode)) {
1434         LOGV("~~~%s seekTimeUs: %lld, mode: %d", av_get_media_type_string(mMediaType), seekTimeUs, mode);
1435         if (mExtractor->stream_seek(seekTimeUs, mMediaType) == SEEK)
1436             seeking = true;
1437     }
1438
1439 retry:
1440     if (mExtractor->packet_queue_get(mQueue, &pkt, 1) < 0) {
1441         mExtractor->reachedEOS(mMediaType);
1442         return ERROR_END_OF_STREAM;
1443     }
1444
1445     if (seeking) {
1446         if (pkt.data != flush_pkt.data) {
1447             av_free_packet(&pkt);
1448             goto retry;
1449         } else {
1450             seeking = false;
1451 #if WAIT_KEY_PACKET_AFTER_SEEK
1452             waitKeyPkt = true;
1453 #endif
1454         }
1455     }
1456
1457     if (pkt.data == flush_pkt.data) {
1458         LOGV("read %s flush pkt", av_get_media_type_string(mMediaType));
1459         av_free_packet(&pkt);
1460         goto retry;
1461     } else if (pkt.data == NULL && pkt.size == 0) {
1462         LOGV("read %s eos pkt", av_get_media_type_string(mMediaType));
1463         av_free_packet(&pkt);
1464         mExtractor->reachedEOS(mMediaType);
1465         return ERROR_END_OF_STREAM;
1466     }
1467
1468     key = pkt.flags & AV_PKT_FLAG_KEY ? 1 : 0;
1469
1470     if (waitKeyPkt) {
1471         if (!key) {
1472             LOGV("drop the no key packet");
1473             av_free_packet(&pkt);
1474             goto retry;
1475         } else {
1476             LOGV("~~~~~~ got the key packet");
1477             waitKeyPkt = false;
1478         }
1479     }
1480      
1481     MediaBuffer *mediaBuffer = new MediaBuffer(pkt.size + FF_INPUT_BUFFER_PADDING_SIZE);
1482     mediaBuffer->meta_data()->clear();
1483     mediaBuffer->set_range(0, pkt.size);
1484 #if DISABLE_NAL_TO_ANNEXB
1485     mNal2AnnexB = false;
1486 #endif
1487     if (mIsAVC && mNal2AnnexB) {
1488         /* Convert H.264 NAL format to annex b */
1489         if (mNALLengthSize >= 3 && mNALLengthSize <= 4 )
1490         {
1491             uint8_t *dst = (uint8_t *)mediaBuffer->data();
1492
1493             /* This only works for NAL sizes 3-4 */
1494             size_t len = pkt.size, i;
1495             uint8_t *ptr = pkt.data;
1496             while (len >= mNALLengthSize) {
1497                 uint32_t nal_len = 0;
1498                 for( i = 0; i < mNALLengthSize; i++ ) {
1499                     nal_len = (nal_len << 8) | ptr[i];
1500                     dst[i] = 0;
1501                 }
1502                 dst[mNALLengthSize - 1] = 1;
1503                 if (nal_len > INT_MAX || nal_len > (unsigned int)len) {
1504                     status = ERROR_MALFORMED;
1505                     break;
1506                 }
1507                 dst += mNALLengthSize;
1508                 ptr += mNALLengthSize;
1509                 len -= mNALLengthSize;
1510
1511                 memcpy(dst, ptr, nal_len);
1512
1513                 dst += nal_len;
1514                 ptr += nal_len;
1515                 len -= nal_len;
1516             }
1517         } else {
1518              status = ERROR_MALFORMED;
1519         }
1520
1521         if (status != OK) {
1522             LOGV("status != OK");
1523             mediaBuffer->release();
1524             mediaBuffer = NULL;
1525             av_free_packet(&pkt);
1526             return ERROR_MALFORMED;
1527         }
1528     } else {
1529         memcpy(mediaBuffer->data(), pkt.data, pkt.size);
1530     }
1531
1532     pktTS = pkt.pts;
1533     // use dts when AVI
1534     if (pkt.pts == AV_NOPTS_VALUE)
1535         pktTS = pkt.dts;
1536
1537 #if 0
1538     // TODO, Stagefright can't handle negative timestamps
1539     // if needed, work around this by offsetting them manually?
1540     if (pktTS < 0)
1541         pktTS = 0;
1542 #endif
1543
1544     timeUs = (int64_t)(pktTS * av_q2d(mStream->time_base) * 1000000);
1545
1546 #if 0
1547     LOGV("read %s pkt, size: %d, key: %d, pts: %lld, dts: %lld, timeUs: %llu us (%.2f secs)",
1548         av_get_media_type_string(mMediaType), pkt.size, key, pkt.pts, pkt.dts, timeUs, timeUs/1E6);
1549 #endif
1550
1551 #if 0
1552     // TODO, Stagefright can't handle negative timestamps
1553     // if needed, work around this by offsetting them manually?
1554     if (timeUs < 0)
1555         timeUs = 0;
1556 #endif
1557
1558     mediaBuffer->meta_data()->setInt64(kKeyTime, timeUs);
1559     mediaBuffer->meta_data()->setInt32(kKeyIsSyncFrame, key);
1560
1561     *buffer = mediaBuffer;
1562
1563     av_free_packet(&pkt);
1564
1565     return OK;
1566 }
1567
1568 ////////////////////////////////////////////////////////////////////////////////
1569
1570 // LegacySniffFFMPEG
1571 typedef struct {
1572     const char *extension;
1573     const char *container;
1574 } extmap;
1575
1576 static extmap FILE_EXTS[] = {
1577         {".mp4", MEDIA_MIMETYPE_CONTAINER_MPEG4},
1578         {".3gp", MEDIA_MIMETYPE_CONTAINER_MPEG4},
1579         {".mp3", MEDIA_MIMETYPE_AUDIO_MPEG},
1580         {".mov", MEDIA_MIMETYPE_CONTAINER_MOV},
1581         {".mkv", MEDIA_MIMETYPE_CONTAINER_MATROSKA},
1582         {".ts",  MEDIA_MIMETYPE_CONTAINER_TS},
1583         {".avi", MEDIA_MIMETYPE_CONTAINER_AVI},
1584         {".asf", MEDIA_MIMETYPE_CONTAINER_ASF},
1585 #if 0
1586         {".wmv", MEDIA_MIMETYPE_CONTAINER_WMV},
1587         {".wma", MEDIA_MIMETYPE_CONTAINER_WMA},
1588         {".mpg", MEDIA_MIMETYPE_CONTAINER_MPG},
1589         {".flv", MEDIA_MIMETYPE_CONTAINER_FLV},
1590         {".divx", MEDIA_MIMETYPE_CONTAINER_DIVX},
1591         {".mp2", MEDIA_MIMETYPE_CONTAINER_MP2},
1592         {".ape", MEDIA_MIMETYPE_CONTAINER_APE},
1593         {".rm ", MEDIA_MIMETYPE_CONTAINER_RM},
1594         {".ra",  MEDIA_MIMETYPE_CONTAINER_RA},
1595 #endif
1596 };
1597
1598 const char *LegacySniffFFMPEG(const char * uri)
1599 {
1600     size_t i;
1601     const char *container = NULL;
1602
1603     LOGI("list the file extensions suppoted by ffmpeg: ");
1604     LOGI("========================================");
1605     for (i = 0; i < NELEM(FILE_EXTS); ++i) {
1606             LOGV("file_exts[%02d]: %s", i, FILE_EXTS[i].extension);
1607     }
1608     LOGI("========================================");
1609
1610     int lenURI = strlen(uri);
1611     for (i = 0; i < NELEM(FILE_EXTS); ++i) {
1612         int len = strlen(FILE_EXTS[i].extension);
1613         int start = lenURI - len;
1614         if (start > 0) {
1615             if (!av_strncasecmp(uri + start, FILE_EXTS[i].extension, len)) {
1616                 container = FILE_EXTS[i].container;
1617                 break;
1618             }
1619         }
1620     }
1621
1622     return container;
1623 }
1624
1625 // BetterSniffFFMPEG
1626 typedef struct {
1627     const char *format;
1628     const char *container;
1629 } formatmap;
1630
1631 static formatmap FILE_FORMATS[] = {
1632         {"mpegts",                  MEDIA_MIMETYPE_CONTAINER_TS},
1633         {"mov,mp4,m4a,3gp,3g2,mj2", MEDIA_MIMETYPE_CONTAINER_MOV},
1634         {"asf",                     MEDIA_MIMETYPE_CONTAINER_ASF},
1635 };
1636
1637 const char *BetterSniffFFMPEG(const char * uri)
1638 {
1639     size_t i;
1640     const char *container = NULL;
1641     AVFormatContext *ic = NULL;
1642
1643     status_t status = initFFmpeg();
1644     if (status != OK) {
1645         LOGE("could not init ffmpeg");
1646         return false;
1647     }
1648
1649     ic = avformat_alloc_context();
1650     avformat_open_input(&ic, uri, NULL, NULL);
1651
1652     av_dump_format(ic, 0, uri, 0);
1653
1654     LOGI("FFmpegExtrator, uri: %s, format_name: %s, format_long_name: %s", uri, ic->iformat->name, ic->iformat->long_name);
1655
1656     LOGI("list the format suppoted by ffmpeg: ");
1657     LOGI("========================================");
1658     for (i = 0; i < NELEM(FILE_FORMATS); ++i) {
1659             LOGV("format_names[%02d]: %s", i, FILE_FORMATS[i].format);
1660     }
1661     LOGI("========================================");
1662
1663     for (i = 0; i < NELEM(FILE_FORMATS); ++i) {
1664         int len = strlen(FILE_FORMATS[i].format);
1665         if (!av_strncasecmp(ic->iformat->name, FILE_FORMATS[i].format, len)) {
1666             container = FILE_FORMATS[i].container;
1667             break;
1668         }
1669     }
1670
1671     avformat_close_input(&ic);
1672     av_free(ic);
1673
1674     return container;
1675 }
1676
1677 bool SniffFFMPEG(
1678         const sp<DataSource> &source, String8 *mimeType, float *confidence,
1679         sp<AMessage> *meta) {
1680     LOGV("SniffFFMPEG");
1681     const char *uri, *container = NULL;
1682
1683     uri = source->getNamURI();
1684
1685     if (!uri)
1686         return false;
1687
1688     LOGI("ffmpeg uri: %s", uri);
1689
1690     container = BetterSniffFFMPEG(uri);
1691     if (!container) {
1692         LOGW("sniff through LegacySniffFFMPEG, only check the file extension");
1693         container = LegacySniffFFMPEG(uri);
1694     }
1695
1696     if (container == NULL)
1697         return false;
1698
1699     LOGV("found container: %s", container);
1700
1701     *confidence = 0.88f;  // Slightly larger than other extractor's confidence
1702     mimeType->setTo(container);
1703
1704     /* use MPEG4Extractor(not extended extractor) for HTTP source only */
1705     if (!av_strcasecmp(container, MEDIA_MIMETYPE_CONTAINER_MPEG4)
1706             && (source->flags() & DataSource::kIsCachingDataSource)) {
1707             return true;
1708     }
1709
1710     *meta = new AMessage;
1711     (*meta)->setString("extended-extractor", "extended-extractor");
1712     (*meta)->setString("extended-extractor-subtype", "ffmpegextractor");
1713
1714     return true;
1715 }
1716
1717 }  // namespace android