OSDN Git Service

add support for flv
[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 <stdint.h>
22 #include <limits.h> /* INT_MAX */
23 #include <inttypes.h>
24
25 #include <media/stagefright/foundation/ABitReader.h>
26 #include <media/stagefright/foundation/ABuffer.h>
27 #include <media/stagefright/foundation/ADebug.h>
28 #include <media/stagefright/foundation/AMessage.h>
29 #include <media/stagefright/foundation/hexdump.h>
30 #include <media/stagefright/DataSource.h>
31 #include <media/stagefright/MediaBuffer.h>
32 #include <media/stagefright/foundation/ADebug.h>
33 #include <media/stagefright/MediaDefs.h>
34 #include <media/stagefright/MediaErrors.h>
35 #include <media/stagefright/MediaSource.h>
36 #include <media/stagefright/MetaData.h>
37 #include <media/stagefright/Utils.h>
38 #include <cutils/properties.h>
39 #include <utils/String8.h>
40 #include <utils/misc.h>
41
42 #include "include/avc_utils.h"
43 #include "utils/ffmpeg_utils.h"
44 #include "utils/ffmpeg_cmdutils.h"
45 #include "FFmpegExtractor.h"
46
47 #define MAX_QUEUE_SIZE (15 * 1024 * 1024)
48 #define MIN_AUDIOQ_SIZE (20 * 16 * 1024)
49 #define MIN_FRAMES 5
50 #define EXTRACTOR_MAX_PROBE_PACKETS 200
51 #define FF_MAX_EXTRADATA_SIZE ((1 << 28) - FF_INPUT_BUFFER_PADDING_SIZE)
52
53 //debug
54 #define DEBUG_READ_ENTRY           0
55 #define DEBUG_DISABLE_VIDEO        0
56 #define DEBUG_DISABLE_AUDIO        0
57 #define WAIT_KEY_PACKET_AFTER_SEEK 1
58 #define DISABLE_NAL_TO_ANNEXB      0
59 #define DEBUG_PKT                  0
60
61 enum {
62     NO_SEEK = 0,
63     SEEK,
64 };
65
66 static AVPacket flush_pkt;
67
68 namespace android {
69
70 static const char *findMatchingContainer(const char *name);
71
72 struct FFmpegExtractor::Track : public MediaSource {
73     Track(FFmpegExtractor *extractor, sp<MetaData> meta, bool isAVC,
74           AVStream *stream, PacketQueue *queue);
75
76     virtual status_t start(MetaData *params);
77     virtual status_t stop();
78     virtual sp<MetaData> getFormat();
79
80     virtual status_t read(
81             MediaBuffer **buffer, const ReadOptions *options);
82
83 protected:
84     virtual ~Track();
85
86 private:
87     friend struct FFmpegExtractor;
88
89     FFmpegExtractor *mExtractor;
90     sp<MetaData> mMeta;
91
92     enum AVMediaType mMediaType;
93
94     mutable Mutex mLock;
95
96     bool mIsAVC;
97     size_t mNALLengthSize;
98     bool mNal2AnnexB;
99
100     AVStream *mStream;
101     PacketQueue *mQueue;
102
103     int64_t mFirstKeyPktTimestamp;
104
105     DISALLOW_EVIL_CONSTRUCTORS(Track);
106 };
107
108 ////////////////////////////////////////////////////////////////////////////////
109
110 FFmpegExtractor::FFmpegExtractor(const sp<DataSource> &source)
111     : mDataSource(source),
112       mMeta(new MetaData),
113       mInitCheck(NO_INIT),
114       mFFmpegInited(false),
115       mFormatCtx(NULL),
116       mReaderThreadStarted(false) {
117     ALOGV("FFmpegExtractor::FFmpegExtractor");
118
119     buildFileName(source);
120
121     int err = initStreams();
122     if (err < 0) {
123         ALOGE("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         usleep(5000);
135     }
136
137     ALOGV("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     ALOGV("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     ALOGV("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     ALOGV("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     ALOGV("FFmpegExtractor::getMetaData");
186
187     if (mInitCheck != OK) {
188         return NULL;
189     }
190
191     return mMeta;
192 }
193
194 uint32_t FFmpegExtractor::flags() const {
195     ALOGV("FFmpegExtractor::flags");
196
197     if (mInitCheck != OK) {
198         return 0;
199     }
200
201     uint32_t flags = CAN_PAUSE;
202
203     if (mFormatCtx->duration != AV_NOPTS_VALUE) {
204         flags |= CAN_SEEK_BACKWARD | CAN_SEEK_FORWARD | CAN_SEEK;
205     }
206
207     return flags;
208 }
209
210 void FFmpegExtractor::packet_queue_init(PacketQueue *q)
211 {
212     memset(q, 0, sizeof(PacketQueue));
213     pthread_mutex_init(&q->mutex, NULL);
214     pthread_cond_init(&q->cond, NULL);
215     packet_queue_put(q, &flush_pkt);
216 }
217
218 void FFmpegExtractor::packet_queue_flush(PacketQueue *q)
219 {
220     AVPacketList *pkt, *pkt1;
221
222     pthread_mutex_lock(&q->mutex);
223     for (pkt = q->first_pkt; pkt != NULL; pkt = pkt1) {
224         pkt1 = pkt->next;
225         av_free_packet(&pkt->pkt);
226         av_freep(&pkt);
227     }
228     q->last_pkt = NULL;
229     q->first_pkt = NULL;
230     q->nb_packets = 0;
231     q->size = 0;
232     pthread_mutex_unlock(&q->mutex);
233 }
234
235 void FFmpegExtractor::packet_queue_end(PacketQueue *q)
236 {
237     packet_queue_flush(q);
238 }
239
240 void FFmpegExtractor::packet_queue_abort(PacketQueue *q)
241 {
242     pthread_mutex_lock(&q->mutex);
243
244     q->abort_request = 1;
245
246     pthread_cond_signal(&q->cond);
247
248     pthread_mutex_unlock(&q->mutex);
249 }
250
251 int FFmpegExtractor::packet_queue_put(PacketQueue *q, AVPacket *pkt)
252 {
253     AVPacketList *pkt1;
254
255     /* duplicate the packet */
256     if (pkt != &flush_pkt && av_dup_packet(pkt) < 0)
257         return -1;
258
259     pkt1 = (AVPacketList *)av_malloc(sizeof(AVPacketList));
260     if (!pkt1)
261         return -1;
262     pkt1->pkt = *pkt;
263     pkt1->next = NULL;
264
265     pthread_mutex_lock(&q->mutex);
266
267     if (!q->last_pkt)
268
269         q->first_pkt = pkt1;
270     else
271         q->last_pkt->next = pkt1;
272     q->last_pkt = pkt1;
273     q->nb_packets++;
274     //q->size += pkt1->pkt.size + sizeof(*pkt1);
275     q->size += pkt1->pkt.size;
276     pthread_cond_signal(&q->cond);
277
278     pthread_mutex_unlock(&q->mutex);
279     return 0;
280 }
281
282 /* packet queue handling */
283 /* return < 0 if aborted, 0 if no packet and > 0 if packet.  */
284 int FFmpegExtractor::packet_queue_get(PacketQueue *q, AVPacket *pkt, int block)
285 {
286     AVPacketList *pkt1;
287     int ret;
288
289     pthread_mutex_lock(&q->mutex);
290
291     for (;;) {
292         if (q->abort_request) {
293             ret = -1;
294             break;
295         }
296
297         pkt1 = q->first_pkt;
298         if (pkt1) {
299             q->first_pkt = pkt1->next;
300             if (!q->first_pkt)
301                 q->last_pkt = NULL;
302             q->nb_packets--;
303             //q->size -= pkt1->pkt.size + sizeof(*pkt1);
304             q->size -= pkt1->pkt.size;
305             *pkt = pkt1->pkt;
306             av_free(pkt1);
307             ret = 1;
308             break;
309         } else if (!block) {
310             ret = 0;
311             break;
312         } else {
313             pthread_cond_wait(&q->cond, &q->mutex);
314         }
315     }
316     pthread_mutex_unlock(&q->mutex);
317     return ret;
318 }
319
320 static void EncodeSize14(uint8_t **_ptr, size_t size) {
321     CHECK_LE(size, 0x3fff);
322
323     uint8_t *ptr = *_ptr;
324
325     *ptr++ = 0x80 | (size >> 7);
326     *ptr++ = size & 0x7f;
327
328     *_ptr = ptr;
329 }
330
331 static sp<ABuffer> MakeMPEGVideoESDS(const sp<ABuffer> &csd) {
332     sp<ABuffer> esds = new ABuffer(csd->size() + 25);
333
334     uint8_t *ptr = esds->data();
335     *ptr++ = 0x03;
336     EncodeSize14(&ptr, 22 + csd->size());
337
338     *ptr++ = 0x00;  // ES_ID
339     *ptr++ = 0x00;
340
341     *ptr++ = 0x00;  // streamDependenceFlag, URL_Flag, OCRstreamFlag
342
343     *ptr++ = 0x04;
344     EncodeSize14(&ptr, 16 + csd->size());
345
346     *ptr++ = 0x40;  // Audio ISO/IEC 14496-3
347
348     for (size_t i = 0; i < 12; ++i) {
349         *ptr++ = 0x00;
350     }
351
352     *ptr++ = 0x05;
353     EncodeSize14(&ptr, csd->size());
354
355     memcpy(ptr, csd->data(), csd->size());
356
357     return esds;
358 }
359
360 // Returns the sample rate based on the sampling frequency index
361 static uint32_t get_sample_rate(const uint8_t sf_index)
362 {
363     static const uint32_t sample_rates[] =
364     {
365         96000, 88200, 64000, 48000, 44100, 32000,
366         24000, 22050, 16000, 12000, 11025, 8000
367     };
368
369     if (sf_index < sizeof(sample_rates) / sizeof(sample_rates[0])) {
370         return sample_rates[sf_index];
371     }
372
373     return 0;
374 }
375
376 int FFmpegExtractor::check_extradata(AVCodecContext *avctx)
377 {
378     const char *name = NULL;
379     bool *defersToCreateTrack = NULL;
380     AVBitStreamFilterContext **bsfc = NULL;
381
382     // init
383     if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
384         bsfc = &mVideoBsfc;
385         defersToCreateTrack = &mDefersToCreateVideoTrack;
386     } else if (avctx->codec_type == AVMEDIA_TYPE_AUDIO){
387         bsfc = &mAudioBsfc;
388         defersToCreateTrack = &mDefersToCreateAudioTrack;
389     }
390
391     // ignore extradata
392     if (avctx->codec_id == CODEC_ID_MP3 ||
393             avctx->codec_id == CODEC_ID_MP1   ||
394             avctx->codec_id == CODEC_ID_MP2   ||
395             avctx->codec_id == CODEC_ID_AC3   ||
396             avctx->codec_id == CODEC_ID_DTS   ||
397             avctx->codec_id == CODEC_ID_H263  ||
398             avctx->codec_id == CODEC_ID_H263P ||
399             avctx->codec_id == CODEC_ID_H263I ||
400             avctx->codec_id == CODEC_ID_FLV1  ||
401             avctx->codec_id == CODEC_ID_WMV1)
402         return 1;
403
404     // is extradata compatible with android?
405     if (avctx->codec_id != CODEC_ID_AAC) {
406         int is_compatible = is_extradata_compatible_with_android(avctx);
407         if (!is_compatible) {
408             ALOGI("%s extradata is not compatible with android, should to extract it from bitstream",
409                     av_get_media_type_string(avctx->codec_type));
410             *defersToCreateTrack = true;
411             *bsfc = NULL; // H264 don't need bsfc, only AAC?
412             return 0;
413         }
414         return 1;
415     }
416
417     if (avctx->codec_id == CODEC_ID_AAC) {
418         name = "aac_adtstoasc";
419     }
420
421     if (avctx->extradata_size <= 0) {
422         ALOGI("No %s extradata found, should to extract it from bitstream",
423                 av_get_media_type_string(avctx->codec_type));
424         *defersToCreateTrack = true;
425          //CHECK(name != NULL);
426         if (!*bsfc && name) {
427             *bsfc = av_bitstream_filter_init(name);
428             if (!*bsfc) {
429                 ALOGE("Cannot open the %s BSF!", name);
430                 *defersToCreateTrack = false;
431                 return -1;
432             } else {
433                 ALOGV("open the %s bsf", name);
434                 return 0;
435             }
436         } else {
437             return 0;
438         }
439     }
440     return 1;
441 }
442
443 void FFmpegExtractor::printTime(int64_t time)
444 {
445     int hours, mins, secs, us;
446
447     if (time == AV_NOPTS_VALUE)
448         return;
449
450     secs = time / AV_TIME_BASE;
451     us = time % AV_TIME_BASE;
452     mins = secs / 60;
453     secs %= 60;
454     hours = mins / 60;
455     mins %= 60;
456     ALOGI("the time is %02d:%02d:%02d.%02d",
457         hours, mins, secs, (100 * us) / AV_TIME_BASE);
458 }
459
460 int FFmpegExtractor::stream_component_open(int stream_index)
461 {
462     AVCodecContext *avctx = NULL;
463     sp<MetaData> meta = NULL;
464     bool isAVC = false;
465     bool supported = false;
466     uint32_t type = 0;
467     const void *data = NULL;
468     size_t size = 0;
469     int ret = 0;
470
471     ALOGI("stream_index: %d", stream_index);
472     if (stream_index < 0 || stream_index >= (int)mFormatCtx->nb_streams)
473         return -1;
474     avctx = mFormatCtx->streams[stream_index]->codec;
475
476     switch(avctx->codec_id) {
477     case CODEC_ID_H264:
478     case CODEC_ID_MPEG4:
479     case CODEC_ID_H263:
480     case CODEC_ID_H263P:
481     case CODEC_ID_H263I:
482     case CODEC_ID_AAC:
483     case CODEC_ID_AC3:
484     case CODEC_ID_MP1:
485     case CODEC_ID_MP2:
486     case CODEC_ID_MP3:
487     case CODEC_ID_MPEG1VIDEO:
488     case CODEC_ID_MPEG2VIDEO:
489     case CODEC_ID_WMV1:
490     case CODEC_ID_WMV2:
491     case CODEC_ID_WMV3:
492     case CODEC_ID_VC1:
493     case CODEC_ID_WMAV1:
494     case CODEC_ID_WMAV2:
495     case CODEC_ID_WMAPRO:
496     case CODEC_ID_WMALOSSLESS:
497     case CODEC_ID_RV20:
498     case CODEC_ID_RV30:
499     case CODEC_ID_RV40:
500     case CODEC_ID_COOK:
501     case CODEC_ID_APE:
502     case CODEC_ID_DTS:
503     case CODEC_ID_FLAC:
504     case CODEC_ID_FLV1:
505         supported = true;
506         break;
507     default:
508         supported = false;
509         break;
510     }
511
512     if (!supported) {
513         ALOGE("unsupport the codec, id: 0x%0x", avctx->codec_id);
514         return -1;
515     }
516     ALOGV("support the codec");
517
518     unsigned streamType;
519     ssize_t index = mTracks.indexOfKey(stream_index);
520
521     if (index >= 0) {
522         ALOGE("this track already exists");
523         return 0;
524     }
525
526     mFormatCtx->streams[stream_index]->discard = AVDISCARD_DEFAULT;
527
528     char tagbuf[32];
529     av_get_codec_tag_string(tagbuf, sizeof(tagbuf), avctx->codec_tag);
530     ALOGV("Tag %s/0x%08x with codec id '%d'\n", tagbuf, avctx->codec_tag, avctx->codec_id);
531
532     switch (avctx->codec_type) {
533     case AVMEDIA_TYPE_VIDEO:
534         if (mVideoStreamIdx == -1)
535             mVideoStreamIdx = stream_index;
536         if (mVideoStream == NULL)
537             mVideoStream = mFormatCtx->streams[stream_index];
538         if (!mVideoQInited) {
539             packet_queue_init(&mVideoQ);
540             mVideoQInited = true;
541         }
542
543         ret = check_extradata(avctx);
544         if (ret != 1) {
545             if (ret == -1) {
546                 // disable the stream
547                 mVideoStreamIdx = -1;
548                 mVideoStream = NULL;
549                 packet_queue_end(&mVideoQ);
550                 mVideoQInited =  false;
551                 mFormatCtx->streams[stream_index]->discard = AVDISCARD_ALL;
552             }
553             return ret;
554          }
555
556         if (avctx->extradata) {
557             ALOGV("video stream extradata:");
558             hexdump(avctx->extradata, avctx->extradata_size);
559         } else {
560             ALOGV("video stream no extradata, but we can ignore it.");
561         }
562
563         meta = new MetaData;
564
565         switch(avctx->codec_id) {
566         case CODEC_ID_H264:
567             /**
568              * H.264 Video Types
569              * http://msdn.microsoft.com/en-us/library/dd757808(v=vs.85).aspx
570              */
571             //if (avctx->codec_tag && avctx->codec_tag == AV_RL32("avc1")) {
572             if (avctx->extradata[0] == 1 /* configurationVersion */) {
573                 // H.264 bitstream without start codes.
574                 isAVC = true;
575                 ALOGV("AVC");
576
577                 if (avctx->width == 0 || avctx->height == 0) {
578                     int32_t width, height;
579                     sp<ABuffer> seqParamSet = new ABuffer(avctx->extradata_size - 8);
580                     memcpy(seqParamSet->data(), avctx->extradata + 8, avctx->extradata_size - 8);
581                     FindAVCDimensions(seqParamSet, &width, &height);
582                     avctx->width  = width;
583                     avctx->height = height;
584                 }
585
586                 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC);
587                 meta->setData(kKeyAVCC, kTypeAVCC, avctx->extradata, avctx->extradata_size);
588             } else {
589                 // H.264 bitstream with start codes.
590                 isAVC = false;
591                 ALOGV("H264");
592
593                 /* set NULL to release meta as we will new a meta in MakeAVCCodecSpecificData() fxn */
594                 meta->clear();
595                 meta = NULL;
596
597                 sp<ABuffer> buffer = new ABuffer(avctx->extradata_size);
598                 memcpy(buffer->data(), avctx->extradata, avctx->extradata_size);
599                 meta = MakeAVCCodecSpecificData(buffer);
600             }
601             break;
602         case CODEC_ID_MPEG4:
603             ALOGV("MPEG4");
604             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_MPEG4);
605             {
606                 sp<ABuffer> csd = new ABuffer(avctx->extradata_size);
607                 memcpy(csd->data(), avctx->extradata, avctx->extradata_size);
608                 sp<ABuffer> esds = MakeMPEGVideoESDS(csd);
609                 meta->setData(kKeyESDS, kTypeESDS, esds->data(), esds->size());
610             }
611             break;
612         case CODEC_ID_H263:
613         case CODEC_ID_H263P:
614         case CODEC_ID_H263I:
615             ALOGV("H263");
616             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_H263);
617             break;
618         case CODEC_ID_MPEG1VIDEO:
619         case CODEC_ID_MPEG2VIDEO:
620             ALOGV("MPEG%dVIDEO", avctx->codec_id == CODEC_ID_MPEG2VIDEO ? 2 : 1);
621             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_MPEG2);
622             {
623                 sp<ABuffer> csd = new ABuffer(avctx->extradata_size);
624                 memcpy(csd->data(), avctx->extradata, avctx->extradata_size);
625                 sp<ABuffer> esds = MakeMPEGVideoESDS(csd);
626                 meta->setData(kKeyESDS, kTypeESDS, esds->data(), esds->size());
627             }
628             break;
629         case CODEC_ID_VC1:
630             ALOGV("VC1");
631             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_VC1);
632             meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
633             break;
634         case CODEC_ID_WMV1:
635             ALOGV("WMV1");
636             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_WMV);
637             meta->setInt32(kKeyWMVVersion, kTypeWMVVer_7);
638             break;
639         case CODEC_ID_WMV2:
640             ALOGV("WMV2");
641             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_WMV);
642             meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
643             meta->setInt32(kKeyWMVVersion, kTypeWMVVer_8);
644             break;
645         case CODEC_ID_WMV3:
646             ALOGV("WMV3");
647             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_WMV);
648             meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
649             meta->setInt32(kKeyWMVVersion, kTypeWMVVer_9);
650             break;
651         case CODEC_ID_RV20:
652             ALOGV("RV30");
653             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RV);
654             meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
655             meta->setInt32(kKeyRVVersion, kTypeRVVer_G2); //http://en.wikipedia.org/wiki/RealVideo
656         case CODEC_ID_RV30:
657             ALOGV("RV30");
658             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RV);
659             meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
660             meta->setInt32(kKeyRVVersion, kTypeRVVer_8); //http://en.wikipedia.org/wiki/RealVideo
661             break;
662         case CODEC_ID_RV40:
663             ALOGV("RV40");
664             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RV);
665             meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
666             meta->setInt32(kKeyRVVersion, kTypeRVVer_9); //http://en.wikipedia.org/wiki/RealVideo
667             break;
668         case CODEC_ID_FLV1:
669             ALOGV("FLV1");
670             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_FLV1);
671             meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
672             break;
673         default:
674             CHECK(!"Should not be here. Unsupported codec.");
675             break;
676         }
677
678         ALOGI("width: %d, height: %d, bit_rate: %d",
679              avctx->width, avctx->height, avctx->bit_rate);
680
681         meta->setInt32(kKeyWidth, avctx->width);
682         meta->setInt32(kKeyHeight, avctx->height);
683         if (avctx->bit_rate > 0)
684             meta->setInt32(kKeyBitRate, avctx->bit_rate);
685         if (mVideoStream->duration != AV_NOPTS_VALUE) {
686             int64_t duration = mVideoStream->duration * av_q2d(mVideoStream->time_base) * 1000000;
687             printTime(duration);
688             ALOGV("video startTime: %lld", mVideoStream->start_time);
689             meta->setInt64(kKeyDuration, duration);
690         } else {
691             // default when no stream duration
692             meta->setInt64(kKeyDuration, mFormatCtx->duration);
693         }
694
695         ALOGV("create a video track");
696         index = mTracks.add(
697             stream_index, new Track(this, meta, isAVC, mVideoStream, &mVideoQ));
698
699         mDefersToCreateVideoTrack = false;
700
701         break;
702     case AVMEDIA_TYPE_AUDIO:
703         if (mAudioStreamIdx == -1)
704             mAudioStreamIdx = stream_index;
705         if (mAudioStream == NULL)
706             mAudioStream = mFormatCtx->streams[stream_index];
707         if (!mAudioQInited) {
708             packet_queue_init(&mAudioQ);
709             mAudioQInited = true;
710         }
711
712         ret = check_extradata(avctx);
713         if (ret != 1) {
714             if (ret == -1) {
715                 // disable the stream
716                 mAudioStreamIdx = -1;
717                 mAudioStream = NULL;
718                 packet_queue_end(&mAudioQ);
719                 mAudioQInited =  false;
720                 mFormatCtx->streams[stream_index]->discard = AVDISCARD_ALL;
721             }
722             return ret;
723         }
724
725         if (avctx->extradata) {
726             ALOGV("audio stream extradata:");
727             hexdump(avctx->extradata, avctx->extradata_size);
728         } else {
729             ALOGV("audio stream no extradata, but we can ignore it.");
730         }
731
732         switch(avctx->codec_id) {
733         case CODEC_ID_MP1:
734             ALOGV("MP1");
735             meta = new MetaData;
736             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_I);
737             break;
738         case CODEC_ID_MP2:
739             ALOGV("MP2");
740             meta = new MetaData;
741             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_II);
742             break;
743         case CODEC_ID_MP3:
744             ALOGV("MP3");
745             meta = new MetaData;
746             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_MPEG);
747             break;
748         case CODEC_ID_AC3:
749             ALOGV("AC3");
750             meta = new MetaData;
751             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AC3);
752             break;
753         case CODEC_ID_AAC:
754             ALOGV("AAC");
755             uint32_t sr;
756             const uint8_t *header;
757             uint8_t profile, sf_index, channel;
758
759             header = avctx->extradata;
760             CHECK(header != NULL);
761
762             // AudioSpecificInfo follows
763             // oooo offf fccc c000
764             // o - audioObjectType
765             // f - samplingFreqIndex
766             // c - channelConfig
767             profile = ((header[0] & 0xf8) >> 3) - 1;
768             sf_index = (header[0] & 0x07) << 1 | (header[1] & 0x80) >> 7;
769             sr = get_sample_rate(sf_index);
770             if (sr == 0) {
771                 ALOGE("unsupport the sample rate");
772                 return -1;
773             }
774             channel = (header[1] >> 3) & 0xf;
775             ALOGV("profile: %d, sf_index: %d, channel: %d", profile, sf_index, channel);
776
777             meta = MakeAACCodecSpecificData(profile, sf_index, channel);
778             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AAC);
779             break;
780         case CODEC_ID_WMAV1:  // TODO, version?
781             ALOGV("WMAV1");
782             meta = new MetaData;
783             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_WMA);
784             meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
785             break;
786         case CODEC_ID_WMAV2:
787             ALOGV("WMAV2");
788             meta = new MetaData;
789             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_WMA);
790             meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
791             meta->setInt32(kKeyWMAVersion, kTypeWMA);
792             break;
793         case CODEC_ID_WMAPRO:
794             ALOGV("WMAPRO");
795             meta = new MetaData;
796             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_WMA);
797             meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
798             meta->setInt32(kKeyWMAVersion, kTypeWMAPro);
799             break;
800         case CODEC_ID_WMALOSSLESS:
801             ALOGV("WMALOSSLESS");
802             meta = new MetaData;
803             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_WMA);
804             meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
805             meta->setInt32(kKeyWMAVersion, kTypeWMALossLess);
806             break;
807         case CODEC_ID_COOK: // audio codec in RMVB
808             ALOGV("COOK");
809             meta = new MetaData;
810             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_RA);
811             meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
812             break;
813         case CODEC_ID_APE:
814             ALOGV("APE");
815             meta = new MetaData;
816             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_APE);
817             meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
818             break;
819         case CODEC_ID_DTS:
820             ALOGV("DTS");
821             meta = new MetaData;
822             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_DTS);
823             meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
824             break;
825         case CODEC_ID_FLAC:
826             ALOGV("FLAC");
827             meta = new MetaData;
828             meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_FLAC);
829             meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
830             break;
831         default:
832             CHECK(!"Should not be here. Unsupported codec.");
833             break;
834         }
835
836         ALOGI("bit_rate: %d, sample_rate: %d, channels: %d, "
837                 "bits_per_coded_sample: %d, block_align:%d",
838                 avctx->bit_rate, avctx->sample_rate, avctx->channels,
839                 avctx->bits_per_coded_sample, avctx->block_align);
840
841         meta->setInt32(kKeySampleRate, avctx->sample_rate);
842         meta->setInt32(kKeyChannelCount, avctx->channels);
843         meta->setInt32(kKeyBitspersample, avctx->bits_per_coded_sample);
844         meta->setInt32(kKeyBitRate, avctx->bit_rate);
845         meta->setInt32(kKeyBlockAlign, avctx->block_align);
846         if (mAudioStream->duration != AV_NOPTS_VALUE) {
847             int64_t duration = mAudioStream->duration * av_q2d(mAudioStream->time_base) * 1000000;
848             printTime(duration);
849             ALOGV("audio startTime: %lld", mAudioStream->start_time);
850             meta->setInt64(kKeyDuration, duration);
851         } else {
852             // default when no stream duration
853             meta->setInt64(kKeyDuration, mFormatCtx->duration);
854         }
855
856         ALOGV("create a audio track");
857         index = mTracks.add(
858             stream_index, new Track(this, meta, false, mAudioStream, &mAudioQ));
859
860         mDefersToCreateAudioTrack = false;
861
862         break;
863     case AVMEDIA_TYPE_SUBTITLE:
864         /* Unsupport now */
865         CHECK(!"Should not be here. Unsupported media type.");
866         break;
867     default:
868         CHECK(!"Should not be here. Unsupported media type.");
869         break;
870     }
871     return 0;
872 }
873
874 void FFmpegExtractor::stream_component_close(int stream_index)
875 {
876     AVCodecContext *avctx;
877
878     if (stream_index < 0 || stream_index >= (int)mFormatCtx->nb_streams)
879         return;
880     avctx = mFormatCtx->streams[stream_index]->codec;
881
882     switch (avctx->codec_type) {
883     case AVMEDIA_TYPE_VIDEO:
884         ALOGV("packet_queue_abort videoq");
885         packet_queue_abort(&mVideoQ);
886         /* wait until the end */
887         while (!mAbortRequest && !mVideoEOSReceived) {
888             ALOGV("wait for video received");
889             usleep(10000);
890         }
891         ALOGV("packet_queue_end videoq");
892         packet_queue_end(&mVideoQ);
893         break;
894     case AVMEDIA_TYPE_AUDIO:
895         ALOGV("packet_queue_abort audioq");
896         packet_queue_abort(&mAudioQ);
897         while (!mAbortRequest && !mAudioEOSReceived) {
898             ALOGV("wait for audio received");
899             usleep(10000);
900         }
901         ALOGV("packet_queue_end audioq");
902         packet_queue_end(&mAudioQ);
903         break;
904     case AVMEDIA_TYPE_SUBTITLE:
905         break;
906     default:
907         break;
908     }
909
910     mFormatCtx->streams[stream_index]->discard = AVDISCARD_ALL;
911     switch (avctx->codec_type) {
912     case AVMEDIA_TYPE_VIDEO:
913         mVideoStream    = NULL;
914         mVideoStreamIdx = -1;
915         if (mVideoBsfc) {
916             av_bitstream_filter_close(mVideoBsfc);
917             mVideoBsfc  = NULL;
918         }
919         break;
920     case AVMEDIA_TYPE_AUDIO:
921         mAudioStream    = NULL;
922         mAudioStreamIdx = -1;
923         if (mAudioBsfc) {
924             av_bitstream_filter_close(mAudioBsfc);
925             mAudioBsfc  = NULL;
926         }
927         break;
928     case AVMEDIA_TYPE_SUBTITLE:
929         break;
930     default:
931         break;
932     }
933 }
934
935 void FFmpegExtractor::reachedEOS(enum AVMediaType media_type)
936 {
937     Mutex::Autolock autoLock(mLock);
938
939     if (media_type == AVMEDIA_TYPE_VIDEO) {
940         mVideoEOSReceived = true;
941     } else if (media_type == AVMEDIA_TYPE_AUDIO) {
942         mAudioEOSReceived = true;
943     }
944 }
945
946 /* seek in the stream */
947 int FFmpegExtractor::stream_seek(int64_t pos, enum AVMediaType media_type)
948 {
949     Mutex::Autolock autoLock(mLock);
950
951     if (mVideoStreamIdx >= 0 &&
952         mAudioStreamIdx >= 0 &&
953         media_type == AVMEDIA_TYPE_AUDIO &&
954         !mVideoEOSReceived) {
955        return NO_SEEK;
956     }
957
958     // flush immediately
959     if (mAudioStreamIdx >= 0)
960         packet_queue_flush(&mAudioQ);
961     if (mVideoStreamIdx >= 0)
962         packet_queue_flush(&mVideoQ);
963
964     mSeekPos = pos;
965     mSeekFlags &= ~AVSEEK_FLAG_BYTE;
966     mSeekReq = 1;
967
968     return SEEK;
969 }
970
971 // staitc
972 int FFmpegExtractor::decode_interrupt_cb(void *ctx)
973 {
974     FFmpegExtractor *extrator = static_cast<FFmpegExtractor *>(ctx);
975     return extrator->mAbortRequest;
976 }
977
978 void FFmpegExtractor::print_error_ex(const char *filename, int err)
979 {
980     char errbuf[128];
981     const char *errbuf_ptr = errbuf;
982
983     if (av_strerror(err, errbuf, sizeof(errbuf)) < 0)
984         errbuf_ptr = strerror(AVUNERROR(err));
985     ALOGI("%s: %s\n", filename, errbuf_ptr);
986 }
987
988 void FFmpegExtractor::buildFileName(const sp<DataSource> &source)
989 {
990 #if 1
991     ALOGI("android-source:%p", source.get());
992     // pass the addr of smart pointer("source")
993     snprintf(mFilename, sizeof(mFilename), "android-source:%p", source.get());
994     ALOGI("build mFilename: %s", mFilename);
995 #else
996     const char *url = mDataSource->getNamURI();
997     if (url == NULL) {
998         ALOGI("url is error!");
999         return;
1000     }
1001     // is it right?
1002     if (!strcmp(url, "-")) {
1003         av_strlcpy(mFilename, "pipe:", strlen("pipe:") + 1);
1004     } else {
1005         av_strlcpy(mFilename, url, strlen(url) + 1);
1006     }
1007     ALOGI("build url: %s, mFilename: %s", url, mFilename);
1008 #endif
1009 }
1010
1011 void FFmpegExtractor::setFFmpegDefaultOpts()
1012 {
1013     mGenPTS       = 0;
1014 #if DEBUG_DISABLE_VIDEO
1015     mVideoDisable = 1;
1016 #else
1017     mVideoDisable = 0;
1018 #endif
1019 #if DEBUG_DISABLE_AUDIO
1020     mAudioDisable = 1;
1021 #else
1022     mAudioDisable = 0;
1023 #endif
1024     mShowStatus   = 0;
1025     mSeekByBytes  = 0; /* seek by bytes 0=off 1=on -1=auto" */
1026     mDuration     = AV_NOPTS_VALUE;
1027     mSeekPos      = AV_NOPTS_VALUE;
1028     mAutoExit     = 1;
1029     mLoop         = 1;
1030
1031     mVideoStreamIdx = -1;
1032     mAudioStreamIdx = -1;
1033     mVideoStream  = NULL;
1034     mAudioStream  = NULL;
1035     mVideoQInited = false;
1036     mAudioQInited = false;
1037     mDefersToCreateVideoTrack = false;
1038     mDefersToCreateAudioTrack = false;
1039     mVideoBsfc = NULL;
1040     mAudioBsfc = NULL;
1041
1042     mAbortRequest = 0;
1043     mPaused       = 0;
1044     mLastPaused   = 0;
1045     mSeekReq      = 0;
1046
1047     mProbePkts    = 0;
1048     mEOF          = false;
1049 }
1050
1051 int FFmpegExtractor::initStreams()
1052 {
1053     int err = 0;
1054         int i = 0;
1055     status_t status = UNKNOWN_ERROR;
1056     int eof = 0;
1057     int ret = 0, audio_ret = -1, video_ret = -1;
1058     int pkt_in_play_range = 0;
1059     AVDictionaryEntry *t = NULL;
1060     AVDictionary **opts = NULL;
1061     int orig_nb_streams = 0;
1062     int st_index[AVMEDIA_TYPE_NB] = {0};
1063     int wanted_stream[AVMEDIA_TYPE_NB] = {0};
1064     st_index[AVMEDIA_TYPE_AUDIO]  = -1;
1065     st_index[AVMEDIA_TYPE_VIDEO]  = -1;
1066     wanted_stream[AVMEDIA_TYPE_AUDIO]  = -1;
1067     wanted_stream[AVMEDIA_TYPE_VIDEO]  = -1;
1068     const char *mime = NULL;
1069
1070     setFFmpegDefaultOpts();
1071
1072     status = initFFmpeg();
1073     if (status != OK) {
1074         ret = -1;
1075         goto fail;
1076     }
1077     mFFmpegInited = true;
1078
1079     av_init_packet(&flush_pkt);
1080     flush_pkt.data = (uint8_t *)"FLUSH";
1081     flush_pkt.size = 0;
1082
1083     mFormatCtx = avformat_alloc_context();
1084         if (!mFormatCtx)
1085         {
1086         ALOGE("oom for alloc avformat context");
1087         ret = -1;
1088         goto fail;
1089         }
1090     mFormatCtx->interrupt_callback.callback = decode_interrupt_cb;
1091     mFormatCtx->interrupt_callback.opaque = this;
1092     ALOGV("mFilename: %s", mFilename);
1093     err = avformat_open_input(&mFormatCtx, mFilename, NULL, &format_opts);
1094     if (err < 0) {
1095         print_error_ex(mFilename, err);
1096         ret = -1;
1097         goto fail;
1098     }
1099     if ((t = av_dict_get(format_opts, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
1100         ALOGE("Option %s not found.\n", t->key);
1101         //ret = AVERROR_OPTION_NOT_FOUND;
1102         ret = -1;
1103         goto fail;
1104     }
1105
1106     if (mGenPTS)
1107         mFormatCtx->flags |= AVFMT_FLAG_GENPTS;
1108
1109     opts = setup_find_stream_info_opts(mFormatCtx, codec_opts);
1110     orig_nb_streams = mFormatCtx->nb_streams;
1111
1112     err = avformat_find_stream_info(mFormatCtx, opts);
1113     if (err < 0) {
1114         ALOGE("%s: could not find codec parameters\n", mFilename);
1115         ret = -1;
1116         goto fail;
1117     }
1118     for (i = 0; i < orig_nb_streams; i++)
1119         av_dict_free(&opts[i]);
1120     av_freep(&opts);
1121
1122     mime = findMatchingContainer(mFormatCtx->iformat->name);
1123     CHECK(mime != NULL);
1124     mMeta->setCString(kKeyMIMEType, mime);
1125
1126     if (mFormatCtx->pb)
1127         mFormatCtx->pb->eof_reached = 0; // FIXME hack, ffplay maybe should not use url_feof() to test for the end
1128
1129     if (mSeekByBytes < 0)
1130         mSeekByBytes = !!(mFormatCtx->iformat->flags & AVFMT_TS_DISCONT);
1131
1132     for (i = 0; i < (int)mFormatCtx->nb_streams; i++)
1133         mFormatCtx->streams[i]->discard = AVDISCARD_ALL;
1134     if (!mVideoDisable)
1135         st_index[AVMEDIA_TYPE_VIDEO] =
1136             av_find_best_stream(mFormatCtx, AVMEDIA_TYPE_VIDEO,
1137                                 wanted_stream[AVMEDIA_TYPE_VIDEO], -1, NULL, 0);
1138     if (!mAudioDisable)
1139         st_index[AVMEDIA_TYPE_AUDIO] =
1140             av_find_best_stream(mFormatCtx, AVMEDIA_TYPE_AUDIO,
1141                                 wanted_stream[AVMEDIA_TYPE_AUDIO],
1142                                 st_index[AVMEDIA_TYPE_VIDEO],
1143                                 NULL, 0);
1144     if (mShowStatus) {
1145         av_dump_format(mFormatCtx, 0, mFilename, 0);
1146     }
1147
1148     if (mFormatCtx->duration != AV_NOPTS_VALUE &&
1149             mFormatCtx->start_time != AV_NOPTS_VALUE) {
1150         int hours, mins, secs, us;
1151
1152         ALOGV("file startTime: %lld", mFormatCtx->start_time);
1153
1154         mDuration = mFormatCtx->duration;
1155
1156         secs = mDuration / AV_TIME_BASE;
1157         us = mDuration % AV_TIME_BASE;
1158         mins = secs / 60;
1159         secs %= 60;
1160         hours = mins / 60;
1161         mins %= 60;
1162         ALOGI("the duration is %02d:%02d:%02d.%02d",
1163             hours, mins, secs, (100 * us) / AV_TIME_BASE);
1164     }
1165
1166     if (st_index[AVMEDIA_TYPE_AUDIO] >= 0) {
1167         audio_ret = stream_component_open(st_index[AVMEDIA_TYPE_AUDIO]);
1168     }
1169
1170     if (st_index[AVMEDIA_TYPE_VIDEO] >= 0) {
1171         video_ret = stream_component_open(st_index[AVMEDIA_TYPE_VIDEO]);
1172     }
1173
1174     if ( audio_ret < 0 && video_ret < 0) {
1175         ALOGE("%s: could not open codecs\n", mFilename);
1176         ret = -1;
1177         goto fail;
1178     }
1179
1180     ret = 0;
1181
1182 fail:
1183     return ret;
1184 }
1185
1186 void FFmpegExtractor::deInitStreams()
1187 {
1188     if (mFormatCtx) {
1189         avformat_close_input(&mFormatCtx);
1190     }
1191
1192     if (mFFmpegInited) {
1193         deInitFFmpeg();
1194     }
1195 }
1196
1197 status_t FFmpegExtractor::startReaderThread() {
1198     ALOGV("Starting reader thread");
1199     Mutex::Autolock autoLock(mLock);
1200
1201     if (mReaderThreadStarted)
1202         return OK;
1203
1204     pthread_attr_t attr;
1205     pthread_attr_init(&attr);
1206     pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
1207     pthread_create(&mReaderThread, &attr, ReaderWrapper, this);
1208     pthread_attr_destroy(&attr);
1209     mReaderThreadStarted = true;
1210     ALOGD("Reader thread started");
1211
1212     return OK;
1213 }
1214
1215 void FFmpegExtractor::stopReaderThread() {
1216     ALOGV("Stopping reader thread");
1217     Mutex::Autolock autoLock(mLock);
1218
1219     if (!mReaderThreadStarted) {
1220         ALOGD("Reader thread have been stopped");
1221         return;
1222     }
1223
1224     mAbortRequest = 1;
1225
1226     void *dummy;
1227     pthread_join(mReaderThread, &dummy);
1228     mReaderThreadStarted = false;
1229     ALOGD("Reader thread stopped");
1230 }
1231
1232 // static
1233 void *FFmpegExtractor::ReaderWrapper(void *me) {
1234     ((FFmpegExtractor *)me)->readerEntry();
1235
1236     return NULL;
1237 }
1238
1239 void FFmpegExtractor::readerEntry() {
1240     int err, i, ret;
1241     AVPacket pkt1, *pkt = &pkt1;
1242     int eof = 0;
1243     int pkt_in_play_range = 0;
1244
1245     ALOGV("FFmpegExtractor enter thread(readerEntry)");
1246
1247     mVideoEOSReceived = false;
1248     mAudioEOSReceived = false;
1249
1250     for (;;) {
1251         if (mAbortRequest)
1252             break;
1253
1254         if (mPaused != mLastPaused) {
1255             mLastPaused = mPaused;
1256             if (mPaused)
1257                 mReadPauseReturn = av_read_pause(mFormatCtx);
1258             else
1259                 av_read_play(mFormatCtx);
1260         }
1261 #if CONFIG_RTSP_DEMUXER || CONFIG_MMSH_PROTOCOL
1262         if (mPaused &&
1263                 (!strcmp(mFormatCtx->iformat->name, "rtsp") ||
1264                  (mFormatCtx->pb && !strncmp(mFilename, "mmsh:", 5)))) {
1265             /* wait 10 ms to avoid trying to get another packet */
1266             /* XXX: horrible */
1267             usleep(10000);
1268             continue;
1269         }
1270 #endif
1271
1272         if (mSeekReq) {
1273             ALOGV("readerEntry, mSeekReq: %d", mSeekReq);
1274             ret = avformat_seek_file(mFormatCtx, -1, INT64_MIN, mSeekPos, INT64_MAX, mSeekFlags);
1275             if (ret < 0) {
1276                 ALOGE("%s: error while seeking", mFormatCtx->filename);
1277             } else {
1278                 if (mAudioStreamIdx >= 0) {
1279                     packet_queue_flush(&mAudioQ);
1280                     packet_queue_put(&mAudioQ, &flush_pkt);
1281                 }
1282                 if (mVideoStreamIdx >= 0) {
1283                     packet_queue_flush(&mVideoQ);
1284                     packet_queue_put(&mVideoQ, &flush_pkt);
1285                 }
1286             }
1287             mSeekReq = 0;
1288             eof = 0;
1289         }
1290
1291         /* if the queue are full, no need to read more */
1292         if (   mAudioQ.size + mVideoQ.size > MAX_QUEUE_SIZE
1293             || (   (mAudioQ   .size  > MIN_AUDIOQ_SIZE || mAudioStreamIdx < 0)
1294                 && (mVideoQ   .nb_packets > MIN_FRAMES || mVideoStreamIdx < 0))) {
1295 #if DEBUG_READ_ENTRY
1296             ALOGV("readerEntry, is full, fuck");
1297 #endif
1298             /* wait 10 ms */
1299             usleep(10000);
1300             continue;
1301         }
1302
1303         if (eof) {
1304             if (mVideoStreamIdx >= 0) {
1305                 av_init_packet(pkt);
1306                 pkt->data = NULL;
1307                 pkt->size = 0;
1308                 pkt->stream_index = mVideoStreamIdx;
1309                 packet_queue_put(&mVideoQ, pkt);
1310             }
1311             if (mAudioStreamIdx >= 0) {
1312                 av_init_packet(pkt);
1313                 pkt->data = NULL;
1314                 pkt->size = 0;
1315                 pkt->stream_index = mAudioStreamIdx;
1316                 packet_queue_put(&mAudioQ, pkt);
1317             }
1318             usleep(10000);
1319 #if DEBUG_READ_ENTRY
1320             ALOGV("readerEntry, eof = 1, mVideoQ.size: %d, mVideoQ.nb_packets: %d, mAudioQ.size: %d, mAudioQ.nb_packets: %d",
1321                     mVideoQ.size, mVideoQ.nb_packets, mAudioQ.size, mAudioQ.nb_packets);
1322 #endif
1323             if (mAudioQ.size + mVideoQ.size  == 0) {
1324                 if (mAutoExit) {
1325                     ret = AVERROR_EOF;
1326                     goto fail;
1327                 }
1328             }
1329             eof=0;
1330             continue;
1331         }
1332
1333         ret = av_read_frame(mFormatCtx, pkt);
1334         mProbePkts++;
1335         if (ret < 0) {
1336             if (ret == AVERROR_EOF || url_feof(mFormatCtx->pb))
1337                 if (ret == AVERROR_EOF) {
1338                     //ALOGV("ret == AVERROR_EOF");
1339                 }
1340                 if (url_feof(mFormatCtx->pb)) {
1341                     //ALOGV("url_feof(mFormatCtx->pb)");
1342                 }
1343
1344                 eof = 1;
1345                 mEOF = true;
1346             if (mFormatCtx->pb && mFormatCtx->pb->error) {
1347                 ALOGE("mFormatCtx->pb->error: %d", mFormatCtx->pb->error);
1348                 break;
1349             }
1350             usleep(100000);
1351             continue;
1352         }
1353
1354         if (pkt->stream_index == mVideoStreamIdx) {
1355              if (mDefersToCreateVideoTrack) {
1356                 AVCodecContext *avctx = mFormatCtx->streams[mVideoStreamIdx]->codec;
1357
1358                 int i = parser_split(avctx, pkt->data, pkt->size);
1359                 if (i > 0 && i < FF_MAX_EXTRADATA_SIZE) {
1360                     if (avctx->extradata)
1361                         av_freep(&avctx->extradata);
1362                     avctx->extradata_size= i;
1363                     avctx->extradata = (uint8_t *)av_malloc(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
1364                     if (!avctx->extradata) {
1365                         //return AVERROR(ENOMEM);
1366                         ret = AVERROR(ENOMEM);
1367                         goto fail;
1368                     }
1369                     // sps + pps(there may be sei in it)
1370                     memcpy(avctx->extradata, pkt->data, avctx->extradata_size);
1371                     memset(avctx->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
1372                 } else {
1373                     av_free_packet(pkt);
1374                     continue;
1375                 }
1376
1377                 stream_component_open(mVideoStreamIdx);
1378                 if (!mDefersToCreateVideoTrack)
1379                     ALOGI("probe packet counter: %d when create video track ok", mProbePkts);
1380                 if (mProbePkts == EXTRACTOR_MAX_PROBE_PACKETS)
1381                     ALOGI("probe packet counter to max: %d, create video track: %d",
1382                         mProbePkts, !mDefersToCreateVideoTrack);
1383             }
1384         } else if (pkt->stream_index == mAudioStreamIdx) {
1385             int ret;
1386             uint8_t *outbuf;
1387             int   outbuf_size;
1388             AVCodecContext *avctx = mFormatCtx->streams[mAudioStreamIdx]->codec;
1389             if (mAudioBsfc && pkt && pkt->data) {
1390                 ret = av_bitstream_filter_filter(mAudioBsfc, avctx, NULL, &outbuf, &outbuf_size,
1391                                    pkt->data, pkt->size, pkt->flags & AV_PKT_FLAG_KEY);
1392
1393                 if (ret < 0 ||!outbuf_size) {
1394                     av_free_packet(pkt);
1395                     continue;
1396                 }
1397                 if (outbuf && outbuf != pkt->data) {
1398                     memmove(pkt->data, outbuf, outbuf_size);
1399                     pkt->size = outbuf_size;
1400                 }
1401             }
1402             if (mDefersToCreateAudioTrack) {
1403                 if (avctx->extradata_size <= 0) {
1404                     av_free_packet(pkt);
1405                     continue;
1406                 }
1407                 stream_component_open(mAudioStreamIdx);
1408                 if (!mDefersToCreateAudioTrack)
1409                     ALOGI("probe packet counter: %d when create audio track ok", mProbePkts);
1410                 if (mProbePkts == EXTRACTOR_MAX_PROBE_PACKETS)
1411                     ALOGI("probe packet counter to max: %d, create audio track: %d",
1412                         mProbePkts, !mDefersToCreateAudioTrack);
1413             }
1414         }
1415
1416         if (pkt->stream_index == mAudioStreamIdx) {
1417             packet_queue_put(&mAudioQ, pkt);
1418         } else if (pkt->stream_index == mVideoStreamIdx) {
1419             packet_queue_put(&mVideoQ, pkt);
1420         } else {
1421             av_free_packet(pkt);
1422         }
1423     }
1424     /* wait until the end */
1425     while (!mAbortRequest) {
1426         usleep(100000);
1427     }
1428
1429     ret = 0;
1430 fail:
1431     ALOGI("reader thread goto end...");
1432
1433     /* close each stream */
1434     if (mAudioStreamIdx >= 0)
1435         stream_component_close(mAudioStreamIdx);
1436     if (mVideoStreamIdx >= 0)
1437         stream_component_close(mVideoStreamIdx);
1438     if (mFormatCtx) {
1439         avformat_close_input(&mFormatCtx);
1440     }
1441
1442     ALOGV("FFmpegExtractor exit thread(readerEntry)");
1443 }
1444
1445 ////////////////////////////////////////////////////////////////////////////////
1446
1447 FFmpegExtractor::Track::Track(
1448         FFmpegExtractor *extractor, sp<MetaData> meta, bool isAVC,
1449         AVStream *stream, PacketQueue *queue)
1450     : mExtractor(extractor),
1451       mMeta(meta),
1452       mIsAVC(isAVC),
1453       mStream(stream),
1454       mQueue(queue) {
1455     const char *mime;
1456
1457     /* H.264 Video Types */
1458     {
1459         mNal2AnnexB = false;
1460
1461         if (mIsAVC) {
1462             uint32_t type;
1463             const void *data;
1464             size_t size;
1465             CHECK(meta->findData(kKeyAVCC, &type, &data, &size));
1466
1467             const uint8_t *ptr = (const uint8_t *)data;
1468
1469             CHECK(size >= 7);
1470             CHECK_EQ((unsigned)ptr[0], 1u);  // configurationVersion == 1
1471
1472             // The number of bytes used to encode the length of a NAL unit.
1473             mNALLengthSize = 1 + (ptr[4] & 3);
1474
1475             ALOGV("the stream is AVC, the length of a NAL unit: %d", mNALLengthSize);
1476
1477             mNal2AnnexB = true;
1478         }
1479     }
1480
1481     mMediaType = mStream->codec->codec_type;
1482     mFirstKeyPktTimestamp = AV_NOPTS_VALUE;
1483 }
1484
1485 FFmpegExtractor::Track::~Track() {
1486     ALOGV("FFmpegExtractor::Track::~Track %s",
1487             av_get_media_type_string(mMediaType));
1488         mExtractor = NULL;
1489         mMeta = NULL;
1490 }
1491
1492 status_t FFmpegExtractor::Track::start(MetaData *params) {
1493     ALOGV("FFmpegExtractor::Track::start %s",
1494             av_get_media_type_string(mMediaType));
1495     Mutex::Autolock autoLock(mLock);
1496     //mExtractor->startReaderThread();
1497     return OK;
1498 }
1499
1500 status_t FFmpegExtractor::Track::stop() {
1501     ALOGV("FFmpegExtractor::Track::stop %s",
1502             av_get_media_type_string(mMediaType));
1503     Mutex::Autolock autoLock(mLock);
1504     //mExtractor->stopReaderThread();
1505     return OK;
1506 }
1507
1508 sp<MetaData> FFmpegExtractor::Track::getFormat() {
1509     Mutex::Autolock autoLock(mLock);
1510
1511     return mMeta;
1512 }
1513
1514 status_t FFmpegExtractor::Track::read(
1515         MediaBuffer **buffer, const ReadOptions *options) {
1516     *buffer = NULL;
1517
1518     Mutex::Autolock autoLock(mLock);
1519
1520     AVPacket pkt;
1521     bool seeking = false;
1522     bool waitKeyPkt = false;
1523     ReadOptions::SeekMode mode;
1524     int64_t pktTS = AV_NOPTS_VALUE;
1525     int64_t seekTimeUs = AV_NOPTS_VALUE;
1526     int64_t timeUs;
1527     int key;
1528     status_t status = OK;
1529
1530     if (options && options->getSeekTo(&seekTimeUs, &mode)) {
1531         ALOGV("~~~%s seekTimeUs: %lld, mode: %d", av_get_media_type_string(mMediaType), seekTimeUs, mode);
1532         /* add the stream start time */
1533         if (mStream->start_time != AV_NOPTS_VALUE)
1534             seekTimeUs += mStream->start_time * av_q2d(mStream->time_base) * 1000000;
1535         ALOGV("~~~%s seekTimeUs[+startTime]: %lld, mode: %d", av_get_media_type_string(mMediaType), seekTimeUs, mode);
1536
1537         if (mExtractor->stream_seek(seekTimeUs, mMediaType) == SEEK)
1538             seeking = true;
1539     }
1540
1541 retry:
1542     if (mExtractor->packet_queue_get(mQueue, &pkt, 1) < 0) {
1543         mExtractor->reachedEOS(mMediaType);
1544         return ERROR_END_OF_STREAM;
1545     }
1546
1547     if (seeking) {
1548         if (pkt.data != flush_pkt.data) {
1549             av_free_packet(&pkt);
1550             goto retry;
1551         } else {
1552             seeking = false;
1553 #if WAIT_KEY_PACKET_AFTER_SEEK
1554             waitKeyPkt = true;
1555 #endif
1556         }
1557     }
1558
1559     if (pkt.data == flush_pkt.data) {
1560         ALOGV("read %s flush pkt", av_get_media_type_string(mMediaType));
1561         av_free_packet(&pkt);
1562         mFirstKeyPktTimestamp = AV_NOPTS_VALUE;
1563         goto retry;
1564     } else if (pkt.data == NULL && pkt.size == 0) {
1565         ALOGD("read %s eos pkt", av_get_media_type_string(mMediaType));
1566         av_free_packet(&pkt);
1567         mExtractor->reachedEOS(mMediaType);
1568             return ERROR_END_OF_STREAM;
1569     }
1570
1571     key = pkt.flags & AV_PKT_FLAG_KEY ? 1 : 0;
1572     pktTS = pkt.pts;
1573     // use dts when AVI
1574     if (pkt.pts == AV_NOPTS_VALUE)
1575         pktTS = pkt.dts;
1576
1577     if (waitKeyPkt) {
1578         if (!key) {
1579             ALOGV("drop the no key packet");
1580             av_free_packet(&pkt);
1581             goto retry;
1582         } else {
1583             ALOGV("~~~~~~ got the key packet");
1584             waitKeyPkt = false;
1585         }
1586     }
1587
1588     if (mFirstKeyPktTimestamp == AV_NOPTS_VALUE) {
1589         // update the first key timestamp
1590         mFirstKeyPktTimestamp = pktTS;
1591     }
1592      
1593     if (pktTS < mFirstKeyPktTimestamp) {
1594             ALOGV("drop the packet with the backward timestamp, maybe they are B-frames after I-frame ^_^");
1595             av_free_packet(&pkt);
1596             goto retry;
1597     }
1598
1599     MediaBuffer *mediaBuffer = new MediaBuffer(pkt.size + FF_INPUT_BUFFER_PADDING_SIZE);
1600     mediaBuffer->meta_data()->clear();
1601     mediaBuffer->set_range(0, pkt.size);
1602 #if DISABLE_NAL_TO_ANNEXB
1603     mNal2AnnexB = false;
1604 #endif
1605     if (mIsAVC && mNal2AnnexB) {
1606         /* Convert H.264 NAL format to annex b */
1607         if (mNALLengthSize >= 3 && mNALLengthSize <= 4 )
1608         {
1609             uint8_t *dst = (uint8_t *)mediaBuffer->data();
1610
1611             /* This only works for NAL sizes 3-4 */
1612             size_t len = pkt.size, i;
1613             uint8_t *ptr = pkt.data;
1614             while (len >= mNALLengthSize) {
1615                 uint32_t nal_len = 0;
1616                 for( i = 0; i < mNALLengthSize; i++ ) {
1617                     nal_len = (nal_len << 8) | ptr[i];
1618                     dst[i] = 0;
1619                 }
1620                 dst[mNALLengthSize - 1] = 1;
1621                 if (nal_len > INT_MAX || nal_len > (unsigned int)len) {
1622                     status = ERROR_MALFORMED;
1623                     break;
1624                 }
1625                                 dst += mNALLengthSize;
1626                                 ptr += mNALLengthSize;
1627                 len -= mNALLengthSize;
1628
1629                 memcpy(dst, ptr, nal_len);
1630
1631                 dst += nal_len;
1632                 ptr += nal_len;
1633                 len -= nal_len;
1634             }
1635         } else {
1636              status = ERROR_MALFORMED;
1637         }
1638
1639         if (status != OK) {
1640             ALOGV("status != OK");
1641             mediaBuffer->release();
1642             mediaBuffer = NULL;
1643             av_free_packet(&pkt);
1644             return ERROR_MALFORMED;
1645         }
1646     } else {
1647         memcpy(mediaBuffer->data(), pkt.data, pkt.size);
1648     }
1649
1650     int64_t start_time = mStream->start_time != AV_NOPTS_VALUE ? mStream->start_time : 0;
1651     timeUs = (int64_t)((pktTS - start_time) * av_q2d(mStream->time_base) * 1000000);
1652
1653 #if DEBUG_PKT
1654     ALOGV("read %s pkt, size: %d, key: %d, pts: %lld, dts: %lld, timeUs[-startTime]: %llu us (%.2f secs)",
1655         av_get_media_type_string(mMediaType), pkt.size, key, pkt.pts, pkt.dts, timeUs, timeUs/1E6);
1656 #endif
1657
1658     mediaBuffer->meta_data()->setInt64(kKeyTime, timeUs);
1659     mediaBuffer->meta_data()->setInt32(kKeyIsSyncFrame, key);
1660
1661     *buffer = mediaBuffer;
1662
1663     av_free_packet(&pkt);
1664
1665     return OK;
1666 }
1667
1668 ////////////////////////////////////////////////////////////////////////////////
1669
1670 typedef struct {
1671     const char *format;
1672     const char *container;
1673 } formatmap;
1674
1675 static formatmap FILE_FORMATS[] = {
1676         {"mpeg",                    MEDIA_MIMETYPE_CONTAINER_MPEG2PS  },
1677         {"mpegts",                  MEDIA_MIMETYPE_CONTAINER_TS       },
1678         {"mov,mp4,m4a,3gp,3g2,mj2", MEDIA_MIMETYPE_CONTAINER_MPEG4    },
1679         {"matroska,webm",           MEDIA_MIMETYPE_CONTAINER_MATROSKA },
1680         {"asf",                     MEDIA_MIMETYPE_CONTAINER_ASF      },
1681         {"rm",                      MEDIA_MIMETYPE_CONTAINER_RM       },
1682         {"flv",                     MEDIA_MIMETYPE_CONTAINER_FLV      },
1683         {"swf",                     MEDIA_MIMETYPE_CONTAINER_FLV      },
1684         {"avi",                     MEDIA_MIMETYPE_CONTAINER_AVI      },
1685         {"ape",                     MEDIA_MIMETYPE_CONTAINER_APE      },
1686         {"dts",                     MEDIA_MIMETYPE_CONTAINER_DTS      },
1687         {"flac",                    MEDIA_MIMETYPE_CONTAINER_FLAC     },
1688         {"ac3",                     MEDIA_MIMETYPE_AUDIO_AC3          },
1689         {"wav",                     MEDIA_MIMETYPE_CONTAINER_WAV      },
1690 };
1691
1692 static void adjustMPEG4Confidence(AVFormatContext *ic, float *confidence)
1693 {
1694         AVDictionary *tags = NULL;
1695         AVDictionaryEntry *tag = NULL;
1696
1697         tags = ic->metadata;
1698
1699         //NOTE: You can use command to show these tags,
1700         //e.g. "ffprobe -show_format 2012.mov"
1701
1702         tag = av_dict_get(tags, "major_brand", NULL, 0);
1703         if (!tag) {
1704                 return;
1705         }
1706
1707         ALOGV("major_brand tag is:%s", tag->value);
1708
1709         //when MEDIA_MIMETYPE_CONTAINER_MPEG4
1710         //WTF, MPEG4Extractor.cpp can not extractor mov format
1711         //NOTE: isCompatibleBrand(MPEG4Extractor.cpp)
1712         //  Won't promise that the following file types can be played.
1713         //  Just give these file types a chance.
1714         //  FOURCC('q', 't', ' ', ' '),  // Apple's QuickTime
1715         //So......
1716         if (!strcmp(tag->value, "qt  ")) {
1717                 ALOGI("format is mov, confidence should be larger than mpeg4");
1718                 //the MEDIA_MIMETYPE_CONTAINER_MPEG4 of confidence is 0.4f
1719                 *confidence = 0.41f;
1720         }
1721 }
1722
1723 static void adjustVideoCodecConfidence(AVFormatContext *ic,
1724                 enum AVCodecID codec_id, float *confidence)
1725 {
1726         //add to here
1727 }
1728
1729 //TODO. if the other stream(e.g. mp3) is supported by stagefright
1730 static void adjustAudioCodecConfidence(AVFormatContext *ic,
1731                 enum AVCodecID codec_id, float *confidence)
1732 {
1733         switch (codec_id) {
1734         case CODEC_ID_AC3:
1735                 ALOGI("ffmpeg can demux ac3 only");
1736                 *confidence = 0.88f;
1737                 break;
1738         case CODEC_ID_MP1:
1739         case CODEC_ID_MP2:
1740                 //TODO. if the other stream(e.g. mp3) is supported by stagefright
1741                 ALOGI("ffmpeg can demux mp1 and mp2 only");
1742                 *confidence = 0.88f;
1743                 break;
1744         default:
1745                 break;
1746         }
1747 }
1748
1749 static void adjustCodecConfidence(AVFormatContext *ic, float *confidence)
1750 {
1751         unsigned int idx = 0;
1752         AVCodecContext *avctx = NULL;
1753         AVMediaType     codec_type = AVMEDIA_TYPE_UNKNOWN;
1754         enum AVCodecID codec_id = AV_CODEC_ID_NONE;
1755         bool haveVideo = false;
1756         bool haveAudio = false;
1757         bool haveMP3 = false;
1758
1759         for (idx = 0; idx < ic->nb_streams; idx++) {
1760                 avctx = ic->streams[idx]->codec;
1761                 codec_type = avctx->codec_type;
1762                 codec_id = avctx->codec_id;
1763
1764                 if (codec_type == AVMEDIA_TYPE_VIDEO) {
1765                         haveVideo = true;
1766                         adjustVideoCodecConfidence(ic, codec_id, confidence);
1767                 } else if (codec_type == AVMEDIA_TYPE_AUDIO) {
1768                         haveAudio = true;
1769                         adjustAudioCodecConfidence(ic, codec_id, confidence);
1770                         if (codec_id == CODEC_ID_MP3)
1771                                 haveMP3 = true;
1772                 }
1773         }
1774
1775         if (haveVideo && haveMP3) {
1776                 *confidence = 0.22f; // larger than MP3Extractor an MP3Extractor
1777         }
1778 }
1779
1780 static void adjustConfidenceIfNeeded(const char *mime,
1781                 AVFormatContext *ic, float *confidence)
1782 {
1783         //check mime
1784         if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MPEG4)) {
1785                 adjustMPEG4Confidence(ic, confidence);
1786         } else {
1787                 //add to here;
1788         }
1789
1790         //check codec
1791         adjustCodecConfidence(ic, confidence);
1792 }
1793
1794 static const char *findMatchingContainer(const char *name)
1795 {
1796         size_t i = 0;
1797         const char *container = NULL;
1798
1799         ALOGI("list the formats suppoted by ffmpeg: ");
1800         ALOGI("========================================");
1801         for (i = 0; i < NELEM(FILE_FORMATS); ++i) {
1802                 ALOGV("format_names[%02d]: %s", i, FILE_FORMATS[i].format);
1803         }
1804         ALOGI("========================================");
1805
1806         for (i = 0; i < NELEM(FILE_FORMATS); ++i) {
1807                 int len = strlen(FILE_FORMATS[i].format);
1808                 if (!av_strncasecmp(name, FILE_FORMATS[i].format, len)) {
1809                         container = FILE_FORMATS[i].container;
1810                         break;
1811                 }
1812         }
1813
1814         return container;
1815 }
1816
1817 static const char *SniffFFMPEGCommon(const char *url, float *confidence)
1818 {
1819         size_t i = 0;
1820         int err = 0;
1821         const char *container = NULL;
1822         AVFormatContext *ic = NULL;
1823         AVDictionary **opts = NULL;
1824         size_t orig_nb_streams = 0;
1825
1826         status_t status = initFFmpeg();
1827         if (status != OK) {
1828                 ALOGE("could not init ffmpeg");
1829                 return NULL;
1830         }
1831
1832         ic = avformat_alloc_context();
1833         if (!ic)
1834         {
1835                 ALOGE("oom for alloc avformat context");
1836                 goto fail;
1837         }
1838
1839         err = avformat_open_input(&ic, url, NULL, NULL);
1840         if (err < 0) {
1841                 ALOGE("avformat_open_input faild, url: %s err: %d", url, err);
1842                 goto fail;
1843         }
1844
1845         opts = setup_find_stream_info_opts(ic, codec_opts);
1846         orig_nb_streams = ic->nb_streams;
1847         err = avformat_find_stream_info(ic, opts);
1848         if (err < 0) {
1849                 ALOGE("%s: could not find codec parameters", url);
1850                 goto fail;
1851         }
1852         for (i = 0; i < orig_nb_streams; i++) {
1853                 av_dict_free(&opts[i]);
1854         }
1855         av_freep(&opts);
1856
1857         av_dump_format(ic, 0, url, 0);
1858
1859         ALOGI("FFmpegExtrator, url: %s, format_name: %s, format_long_name: %s",
1860                         url, ic->iformat->name, ic->iformat->long_name);
1861
1862         container = findMatchingContainer(ic->iformat->name);
1863
1864         if (container) {
1865                 adjustConfidenceIfNeeded(container, ic, confidence);
1866         }
1867
1868 fail:
1869         if (ic) {
1870                 avformat_close_input(&ic);
1871                 av_free(ic);
1872         }
1873         if (status == OK) {
1874                 deInitFFmpeg();
1875         }
1876
1877         return container;
1878 }
1879
1880 static const char *LegacySniffFFMPEG(const sp<DataSource> &source, float *confidence)
1881 {
1882         String8 uri = source->getUri();
1883         if (uri.empty()) {
1884                 return NULL;
1885         }
1886
1887         ALOGI("source url:%s", uri.string());
1888
1889         return SniffFFMPEGCommon(uri.string(), confidence);
1890 }
1891
1892 static const char *BetterSniffFFMPEG(const sp<DataSource> &source, float *confidence)
1893 {
1894         char url[128] = {0};
1895
1896         ALOGI("android-source:%p", source.get());
1897
1898         // pass the addr of smart pointer("source")
1899         snprintf(url, sizeof(url), "android-source:%p", source.get());
1900
1901         return SniffFFMPEGCommon(url, confidence);
1902 }
1903
1904 bool SniffFFMPEG(
1905         const sp<DataSource> &source, String8 *mimeType, float *confidence,
1906         sp<AMessage> *meta) {
1907         ALOGV("SniffFFMPEG");
1908
1909         *confidence = 0.08f;  // be the last resort, by default
1910
1911         const char *container = BetterSniffFFMPEG(source, confidence);
1912         if (!container) {
1913                 ALOGW("sniff through BetterSniffFFMPEG failed, try LegacySniffFFMPEG");
1914                 container = LegacySniffFFMPEG(source, confidence);
1915                 if (container) {
1916                         ALOGI("sniff through LegacySniffFFMPEG success");
1917                 }
1918         } else {
1919                 ALOGI("sniff through BetterSniffFFMPEG success");
1920         }
1921
1922         if (container == NULL) {
1923                 ALOGD("SniffFFMPEG failed to sniff this source");
1924                 return false;
1925         }
1926
1927         ALOGD("ffmpeg detected media content as '%s' with confidence %.2f",
1928                         container, *confidence);
1929
1930         /* use MPEG4Extractor(not extended extractor) for HTTP source only */
1931         if (!strcasecmp(container, MEDIA_MIMETYPE_CONTAINER_MPEG4)
1932                         && (source->flags() & DataSource::kIsCachingDataSource)) {
1933                 ALOGI("support container: %s, but it is caching data source, "
1934                                 "Don't use ffmpegextractor", container);
1935                 return false;
1936         }
1937
1938         mimeType->setTo(container);
1939
1940         *meta = new AMessage;
1941         (*meta)->setString("extended-extractor", "extended-extractor");
1942         (*meta)->setString("extended-extractor-subtype", "ffmpegextractor");
1943
1944         //debug only
1945         char value[PROPERTY_VALUE_MAX];
1946         property_get("sys.media.parser.ffmpeg", value, "0");
1947         if (atoi(value)) {
1948                 ALOGI("[debug] parser use ffmpeg");
1949                 *confidence = 0.88f;
1950         }
1951
1952         if (*confidence == 0.88f) {
1953                 (*meta)->setString("extended-extractor-use", "ffmpegextractor");
1954         }
1955
1956         return true;
1957 }
1958
1959 MediaExtractor *CreateFFmpegExtractor(const sp<DataSource> &source, const char *mime, const sp<AMessage> &meta) {
1960     MediaExtractor *ret = NULL;
1961     AString notuse;
1962     if (meta.get() && meta->findString("extended-extractor", &notuse) && (
1963             !strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MPEG4)     ||
1964             !strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_MPEG)          ||
1965             !strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AC3)           ||
1966             !strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MOV)       ||
1967             !strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MATROSKA)  ||
1968             !strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_TS)        ||
1969             !strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MPEG2PS)   ||
1970             !strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_AVI)       ||
1971             !strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_ASF)       ||
1972             !strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_WEBM)      ||
1973             !strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_WMV)       ||
1974             !strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MPG)       ||
1975             !strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_FLV)       ||
1976             !strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_DIVX)      ||
1977             !strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_RM)        ||
1978             !strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_WAV)       ||
1979             !strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_FLAC)      ||
1980             !strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_APE)       ||
1981             !strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_DTS)       ||
1982             !strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MP2)       ||
1983             !strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_RA)        ||
1984             !strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_WMA))) {
1985         ret = new FFmpegExtractor(source);
1986     }
1987
1988     ALOGD("%ssupported mime: %s", (ret ? "" : "un"), mime);
1989     return ret;
1990 }
1991
1992 }  // namespace android
1993
1994 extern "C" void getExtractorPlugin(android::MediaExtractor::Plugin *plugin)
1995 {
1996     plugin->sniff = android::SniffFFMPEG;
1997     plugin->create = android::CreateFFmpegExtractor;
1998 }