Http://nv-tegra.nvidia.com/gitweb? P = Android/platform/frameworks/base. Git; A = commitdiff; H = d818c244204bee4890e1a76bb3581b9c10113c8b stagefrightmkv: Enable stagefright MKV
Author |
Siva ramaraju <sramaraju@nvidia.com> |
|
|
Tue, 10 May 2011 05:06:30 + 0000 (+ 0530) |
Committer |
Varun Colbert <vcolbert@nvidia.com> |
|
|
Sat, 14 May 2011 02:16:41 + 0000 (-0700) |
-Support sf mkv parser on GB.
-Changes to stabilize MKV playback.
-Fix crash issues during playback.
-Add DivX/MPEG4 and MP3/AC3 support.
-Bug 816058
-Bug 812529
Change-ID: ib39a744fb054b579455e9d57bd87774e1e9ca681
12 files changed:
Include/Media/stagefright/mediadefs. h |
|
Patch | blob | history |
Include/Media/stagefright/metadata. h |
|
Patch | blob | history |
Media/libstagefright/Android. mk |
|
Patch | blob | history |
Media/libstagefright/ESDs. cpp |
|
Patch | blob | history |
Media/libstagefright/mediadefs. cpp |
|
Patch | blob | history |
Media/libstagefright/mediaextractor. cpp |
|
Patch | blob | history |
Media/libstagefright/omxcodec. cpp |
[Changed mode: 0755-> 0644] |
Patch | blob | history |
Media/libstagefright/superextractor. cpp |
|
Patch | blob | history |
Media/libstagefright/codecs/AVC/DEC/avcdecoder. cpp |
|
Patch | blob | history |
Media/libstagefright/codecs/m4v_h263/DEC/m4vh263decoder. cpp |
|
Patch | blob | history |
Media/libstagefright/matroska/matroskaextractor. cpp |
|
Patch | blob | history |
Media/libstagefright/matroska/mkvparser. cpp |
|
Patch | blob | history |
Diff -- git a/include/Media/stagefright/mediadefs. h B/include/Media/stagefright/mediadefs. hindex eeb9190 .. 883b09a 100644 (File) --- A/include/Media/stagefright/mediadefs. h ++ B/include/Media/stagefright/mediadefs. h @-39,6 + 39,7 @ extern const char * media_mimetype_audio_g711_alaw; extern const char * handle; extern const char * media_mimetype_audio_raw; extern const char * Media _ Mimetype_audio_wma; + extern const char * numeric; extern const char * media_mimetype_container_wav; diff -- git a/include/Media/stagefright/metadata. h B/include/Media/stagefright/metadata. hindex 9301276 .. 4bb2520 100644 (File) --- A/include/Media/stagefright/metadata. h ++ B/include/Media/stagefright/metadata. h @-41,6 + 41,7 @ Enum {kk Eybitrate = 'brte', // int32_t (BPS) kkeyesds = 'esds ', // raw data kkeyavcc = 'avcc', // raw data + kkeyd263 = 'd263 ', // raw data kkeyvorbisinfo = 'vinf', // raw data kkeyvorbisbooks = 'vboo', // raw data kkeywantsnalfragments = 'nalf ', diff -- git a/Media/libstagefright/android. mk B/Media/libstagefright/android. mkindex 5b65682 .. 5cd1b60 100644 (File) --- A/Media/libstagefright/android. MK ++ B/Media/ Libstagefright/android. MK @-3, 7 + 3, 6 @ include $ (clear_vars) include frameworks/base/Media/libstagefright/codecs/common/config. MK-nv_mkv_enabled: = 1 local_src_files: = \ amrextractor. CPP \ @-113,8 + 112,6 @ endif local_cflags + =-wno-multichar-local_cflags + =-labels = $ (callback)-local_module: = libstagefright include $ (build_shared_library) diff -- git a/Media/libstagefright/ESDs. Cpp B/Media/libstagefright/ESDs. cppindex b7c8e0c .. 1240d7b 100644 (File) --- A/Media/libstagefright/ESDs. CPP ++ B/Media/libstagefright/ESDs. CPP-17,6 + 17,10 # include "include/ESDs. H "# include <string. h> + # include <utils/log. h> ++ // # define log_ndebug 0 + # define log_tag "ESDs" namespace Android {@-87,12 + 91,11 @ status_t ESDs: skipdescriptorheader (} while (more ); + * data_offset = offset; If (* Data_size> size) {return error_malformed;}-* data_offset = offset;-Return OK; }- 191,7 + 194,7 @ status_t ESDs: round (size_t offset, size_t size) {status_t err = skipdescriptorheader (offset, size, & tag, & sub_offset, & sub_size);-If (Err! = OK) {+ If (Err! = OK & tag! = Ktag_decoderspecificinfo) {return err;} diff -- git a/Media/libstagefright/mediadefs. cpp B/Media/libstagefright/mediadefs. cppindex a4cdae7 .. cde20b2100644 (File) --- A/Media/libstagefright/mediadefs. CPP ++ B/Media/libstagefright/mediadefs. CPP @-37,6 + 37,7 @ const char * audio = "audio/g711-alaw"; const char * media_mimetype_audio_g711_mlaw = "audio/g711-mlaw"; const char * Audio = "audio/X-MS-WMA"; const char * media_mimetype_audio_raw = "audio/raw"; + const char * media_mimetype_audio_ac3 = "audio/AC3 "; const char * media_mimetype_container_mpeg4 = "Video/MPEG4"; const char * media_mimetype_container_wav = "audio/WAV"; diff -- git a/Media/stlibagefright/mediaextractor. cpp B/Media/libstagefright/mediaextractor. cppindex 71dbf54 .. 123475f 100644 (File) --- /Media/libstagefright/mediaextractor. CPP ++ B/Media/libstagefright/mediaextractor. CPP @-80, 12 + 80, 6 @ sp <mediaextractor> mediaextractor: Create (} else if (! Strcasecmp (MIME, media_mimetype_container_ogg) {return New oggextractor (source);} else if (! Strcasecmp (MIME, media_mimetype_container_matroska) {-# If (nv_mkv_enabled)-{-logv ("nv_mkv_enabled-superextractor invoked");-return New superextractor (source ); -}-# endif logv ("SF matroska extractor invoked"); return New matroskaextractor (source);} else if (! Strcasecmp (MIME, media_mimetype_container_mpeg2ts) {diff -- git a/Media/libstagefright/omxcodec. cpp B/Media/libstagefright/omxcodec. cppold mode 100755 (executable)
New Mode 100644 (file)
Index ca098c2 .. 91c50ad --- A/Media/libstagefright/omxcodec. CPP ++ B/Media/libstagefright/omxcodec. CPP @-587,22 + 587,27 @ status_t omxcodec: configurecodec (const sp <metadata> & Meta, uint32_t flags) {If (meta-> finddata (kkeyesds, & type, & Data, & size) {ESDs (const char *) data, size);-check_eq (ESDs. initcheck (), OK); -- const void * codec_specific_data;-size_t codec_specific_data_size;-ESDs. get Codecspecificinfo (+ // relax and bypass codec specific info if init check fails + // check_eq (ESDs. initcheck (), OK); + If (ESDs. initcheck () = OK) + {+ const void * codec_specific_data; + size_t codec_specific_data_size; + ESDs. getcodecspecificinfo (& codec_specific_data, & response); -- addcodecspecificdata (+ addcodecspecificdata (codec_specific_data, codec_specific_data_size); ++} else I F (meta-> finddata (kkeyavcc, & type, & Data, & size) {// parse the avcdecoderconfigurationrecord const uint8_t * PTR = (const uint8_t *) data; -+ If (PTR = NULL | size <7) {+ logv ("skipcodecdata-kkeyavcc errror: PTR = % x-size = % d", PTR, size ); + goto skipcodecdata; +} Check (size> = 7);-check_eq (PTR [0], 1); // configurationversion = 1 + check_eq (unsigned) PTR [0], 1u); // configurationversion = 1 Uint8_t profile = PTR [1]; uint8_t level = PTR [3]; @-672,6 + 677,7 @ status_t omxcodec: configurecodec (const sp <metadata> & Meta, uint32_t flags) {}}+ skipcodecdata: int32_t bitrate = 0; If (misencoder) {diff -- git a/Media/libstagefright/superextractor. cpp B/Media/libstagefright/superextractor. cppindex 2ed268e .. c8a4567 100644 (File) --- A/Media/libstagefright/superextractor. CPP ++ B/Media/libst Agefright/superextractor. CPP @-1814,80 + 1814,6 cleanup:}-static bool validatemkv (const sp <datasource> & source,-uint8_t * Header, uint32_t readsize) -{-uint32_t CNT = 4; // 4 bytes ebml already read-uint64_t hlen = 0;-int32_t len_mask = 0x80;-int32_t size = 1; -int32_t n = 1;-uint32_t rdsz = 0;-bool status = false;-bool reinitialise = false;-uint8_t * Data = NULL;-If (! Header)-{-Goto cleanup;-}-Data = header;-static const char probe_data [] = "matroska";-logv ("sniffsuper ++ validate MKV "); -hlen = data [CNT ++];-/* determine length of HDR */-while (size <= 8 &&! (Hlen & len_mask) {-size ++;-len_mask >>>= 1;-}-If (size> 8) {-logv ("sniffsuper MKV error-size> 8");-Goto cleanup;-}-hlen & = (len_mask-1);-while (N ++ <size) {-hlen = (hlen <8) | data [CNT ++];-}-logv ("sniff super: Validate MKV-headerlen = % x", hlen ); -/* Check if first read contain the whole header */-If (readsize <(4 + size + hlen) {-// read more data as requried-rdsz = 4 + Size + (uint32_t) hlen;-logv ("sniffsuper: MKV read more data = % d", rdsz);-Data = (uint8_t *) New uint8_t [rdsz]; -If (! Data) {-logv ("sniffsuper MKV error: New alloc data fail");-Goto cleanup;-}-reinitialise = true; -// goto the beginning of the file-size_t readcount = source-> readat (0, Data, rdsz);-If (readcount <(size_t) rdsz) {-logv ("sniffsuper MKV error: n <(ssize_t) rdsz");-Goto cleanup; -}-/* parse through the initial header to check if it contains the-* Document Type 'matroska '. -*/-for (n = 4 + size; n <= (INT) (4 + size + hlen-(sizeof (probe_data)-1); N ++) -{-logv ("sniffsuper MKV memcmp n = % d", n);-If (! Memcmp (& Data [N], probe_data, sizeof (probe_data)-1) {-logv ("sniffsuper break for loop-matroska identified");-status = true; -Goto cleanup;-}-cleanup:-If (Data & reinitialise)-{-logv ("sniffsuper: delete data");-Delete [] data; -}-logv ("sniffsuper -- validate MKV: Status = % x", status);-return status;-}-bool sniffsuper (const sp <datasource> & source, string8 * mimetype, float * confid Ence, sp <amessage> * Meta) @-1917,17 + 1843,6 @ bool sniffsuper (logv ("ASF is identified //"); Return true ;} -Else if (! Memcmp (header, nvfs_mkv_ebml, 4)-{-logv ("sniff super: ebml is identified, sniff MKV now");-If (validatemkv (source, header, readsize )) -{-* mimetype = media_mimetype_container_matroska;-* Confidence = 1.0;-logv ("sniffsuper: MKV identified");-return true;-} return false ;} diff -- git a/Media/libstagefright/codecs/AVC/DEC/avcdecoder. cpp B/Media/libstagefright/codecs/AVC/DEC/avcdecoder. CPP Index 868c514 .. 080fca4 100644 (File) --- A/Media/libstagefright/codecs/AVC/DEC/avcdecoder. CPP ++ B/Media/libstagefright/codecs/AVC/DEC/avcdecoder. CPP @-104,6 + 104,10 @ status_t avcdecoder: Start (metadata *) {// parse the avcdecoderconfigurationrecord const uint8_t * PTR = (const uint8_t *) data; + If (PTR = NULL | size <7) {+ logv ("avcdecoder bad_value: PTR = % x-size = % d", PTR, size); + return Bad_value; +} Check (size> = 7); check_eq (PTR [0], 1 ); // configurationversion = 1 diff -- git a/Media/libstagefright/codecs/m4v_h263/DEC/m4vh263decoder. cpp B/Media/libstagefright/codecs/m4v_h263/DEC/m4vh263decoder. cppindex dcf129e .. 2902b29 100644 (File) --- A/Media/libstagefright/codecs/m4v_h263/DEC/m4vh263decoder. CPP ++ B/Media/libstagefright/codecs/m4v_h263/DEC/m4vh263decoder. CPP @-+ @ Status_t m4vh263decoder: Start (metadata *) {int32_t vol_size = 0; If (meta-> finddata (kkeyesds, & type, & Data, & size )) {ESDs (const uint8_t *) data, size);-check_eq (ESDs. initcheck (), (status_t) OK); -- const void * codec_specific_data;-size_t codec_specific_data_size;-ESDs. getcodecspecificinfo (+ // relax and skip codec specfic info if initcheck fails + // check_eq (ESDs. initcheck (), (status _ T) OK); + If (ESDs. initcheck () = (status_t) OK) + {+ const void * codec_specific_data; + size_t codec_specific_data_size; + ESDs. getcodecspecificinfo (& codec_specific_data, & bytes);-vol_data [0] = (uint8_t *) malloc (bytes);-memcpy (vol_data [0], codec_specific_data, bytes ); -vol_size = codec_specific_data_size; + vol_data [0] = (uint8_t *) malloc (Co Authorization); + memcpy (vol_data [0], codec_specific_data, codec_specific_data_size); + vol_size = codec_specific_data_size; ++} else {vol_data [0] = NULL; vol_size = 0; @-132,7 + 135,10 @ status_t restart: Start (metadata *) {} mp4decodingmode actualmode = pvgetdecbitstreammode (mhandle);-check_eq (INT) mode, (INT) actualmode); + If (mode! = Actualmode) {+ handle (mhandle); + return unknown_error; +} pvsetpostproctype (videodeccontrols *) mhandle, 0); diff -- git a/Media/libstagefright/matroska/notify. cpp B/Media/libstagefright/matroska/matroskaextractor. cppindex 1661130 .. 79c833f 100644 (File) --- A/Media/libstagefright/matroska/matroskaextractor. CPP ++ B/Media/libstagefright/matroska/matroskaextractor. CPP @-12 5, 6 + @ PRIVATE: Enum type {AVC, AAC, + MP3, + AC3, + MPEG4, other}; @-167,12 + 170,22 @ matroskasource :: matroskasource (check (meta-> finddata (kkeyavcc, & dummy, (const void **) & avcc, & avccsize);-check_ge (avccsize, 5u ); -- mnalsizelen = 1 + (avcc [4] & 3); + logv ("avccsize = % d", avccsize); + mnalsizelen = 1; + If (avcc & avccsize> = 5) {+ // relax this since failing for some content + // check _ Ge (avccsize, 5u); + mnalsizelen = 1 + (avcc [4] & 3); ++} logv ("mnalsizelen = % d", mnalsizelen );} else if (! Strcasecmp (MIME, media_mimetype_audio_aac) {mtype = AAC; ++} else if (! Strcasecmp (MIME, media_mimetype_audio_ac3) {+ mtype = AC3; ++} else if (! Strcasecmp (MIME, media_mimetype_audio_mpeg) {+ mtype = MP3; ++} else if (! Strcasecmp (MIME, media_mimetype_video_mpeg4) {+ mtype = MPEG4 ;}@-221,7 + 234,6 @ void blockiterator: Advance () {If (EOS ()) {break;}-mblockentry = mcluster-> getfirst () ;}- 481,10 + 493,10 @ status_t matroskasource: readblock () {status_t matroskasource :: read (mediabuffer ** out, const readoptions * options) {* out = NULL;-int64_t seektimeus; rea