2 * Copyright 2012 Michael Chen <omxcodec@gmail.com>
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 #define LOG_TAG "codec_utils"
18 #include <utils/Log.h>
23 #include "libavcodec/xiph.h"
24 #include "libavutil/intreadwrite.h"
28 #include <utils/Errors.h>
29 #include <media/stagefright/foundation/ABitReader.h>
30 #include <media/stagefright/foundation/ADebug.h>
31 #include <media/stagefright/foundation/avc_utils.h>
32 #include <media/stagefright/MediaDefs.h>
33 #include <media/stagefright/MediaErrors.h>
34 #include <media/stagefright/MetaData.h>
35 #include <media/stagefright/MetaDataUtils.h>
37 #include "codec_utils.h"
41 static void EncodeSize14(uint8_t **_ptr, size_t size) {
42 CHECK_LE(size, 0x3fffu);
46 *ptr++ = 0x80 | (size >> 7);
52 static sp<ABuffer> MakeMPEGVideoESDS(const sp<ABuffer> &csd) {
53 sp<ABuffer> esds = new ABuffer(csd->size() + 25);
55 uint8_t *ptr = esds->data();
57 EncodeSize14(&ptr, 22 + csd->size());
59 *ptr++ = 0x00; // ES_ID
62 *ptr++ = 0x00; // streamDependenceFlag, URL_Flag, OCRstreamFlag
65 EncodeSize14(&ptr, 16 + csd->size());
67 *ptr++ = 0x40; // Audio ISO/IEC 14496-3
69 for (size_t i = 0; i < 12; ++i) {
74 EncodeSize14(&ptr, csd->size());
76 memcpy(ptr, csd->data(), csd->size());
84 //http://msdn.microsoft.com/en-us/library/dd757808(v=vs.85).aspx
86 // H.264 bitstream without start codes.
87 status_t setAVCFormat(AVCodecContext *avctx, MetaDataBase &meta)
91 CHECK_GT(avctx->extradata_size, 0);
92 CHECK_EQ((int)avctx->extradata[0], 1); //configurationVersion
94 if (avctx->width == 0 || avctx->height == 0) {
95 int32_t width, height;
96 sp<ABuffer> seqParamSet = new ABuffer(avctx->extradata_size - 8);
97 memcpy(seqParamSet->data(), avctx->extradata + 8, avctx->extradata_size - 8);
98 FindAVCDimensions(seqParamSet, &width, &height);
100 avctx->height = height;
103 meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC);
104 meta.setData(kKeyAVCC, kTypeAVCC, avctx->extradata, avctx->extradata_size);
109 // H.264 bitstream with start codes.
110 status_t setH264Format(AVCodecContext *avctx, MetaDataBase &meta)
114 CHECK_NE((int)avctx->extradata[0], 1); //configurationVersion
116 if (!MakeAVCCodecSpecificData(meta, avctx->extradata, avctx->extradata_size))
117 return UNKNOWN_ERROR;
122 status_t setMPEG4Format(AVCodecContext *avctx, MetaDataBase &meta)
126 sp<ABuffer> csd = new ABuffer(avctx->extradata_size);
127 memcpy(csd->data(), avctx->extradata, avctx->extradata_size);
128 sp<ABuffer> esds = MakeMPEGVideoESDS(csd);
130 meta.setData(kKeyESDS, kTypeESDS, esds->data(), esds->size());
132 int divxVersion = getDivXVersion(avctx);
133 if (divxVersion >= 0) {
134 meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_DIVX);
135 meta.setInt32(kKeyDivXVersion, divxVersion);
137 meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_MPEG4);
142 status_t setH263Format(AVCodecContext *avctx __unused, MetaDataBase &meta)
146 meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_H263);
151 status_t setMPEG2VIDEOFormat(AVCodecContext *avctx, MetaDataBase &meta)
153 ALOGV("MPEG%uVIDEO", avctx->codec_id == AV_CODEC_ID_MPEG2VIDEO ? 2 : 1);
155 sp<ABuffer> csd = new ABuffer(avctx->extradata_size);
156 memcpy(csd->data(), avctx->extradata, avctx->extradata_size);
157 sp<ABuffer> esds = MakeMPEGVideoESDS(csd);
159 meta.setData(kKeyESDS, kTypeESDS, esds->data(), esds->size());
160 meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_MPEG2);
165 status_t setVC1Format(AVCodecContext *avctx, MetaDataBase &meta)
169 meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_VC1);
170 meta.setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
175 status_t setWMV1Format(AVCodecContext *avctx __unused, MetaDataBase &meta)
179 meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_WMV);
180 meta.setInt32(kKeyWMVVersion, kTypeWMVVer_7);
185 status_t setWMV2Format(AVCodecContext *avctx, MetaDataBase &meta)
189 meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_WMV);
190 meta.setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
191 meta.setInt32(kKeyWMVVersion, kTypeWMVVer_8);
196 status_t setWMV3Format(AVCodecContext *avctx, MetaDataBase &meta)
200 meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_WMV);
201 meta.setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
202 meta.setInt32(kKeyWMVVersion, kTypeWMVVer_9);
207 status_t setRV20Format(AVCodecContext *avctx, MetaDataBase &meta)
211 meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RV);
212 meta.setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
213 meta.setInt32(kKeyRVVersion, kTypeRVVer_G2); //http://en.wikipedia.org/wiki/RealVide
218 status_t setRV30Format(AVCodecContext *avctx, MetaDataBase &meta)
222 meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RV);
223 meta.setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
224 meta.setInt32(kKeyRVVersion, kTypeRVVer_8); //http://en.wikipedia.org/wiki/RealVide
229 status_t setRV40Format(AVCodecContext *avctx, MetaDataBase &meta)
233 meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RV);
234 meta.setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
235 meta.setInt32(kKeyRVVersion, kTypeRVVer_9); //http://en.wikipedia.org/wiki/RealVide
240 status_t setFLV1Format(AVCodecContext *avctx, MetaDataBase &meta)
242 ALOGV("FLV1(Sorenson H263)");
244 meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_FLV1);
245 meta.setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
250 status_t setHEVCFormat(AVCodecContext *avctx, MetaDataBase &meta)
254 meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_HEVC);
255 meta.setData(kKeyHVCC, kTypeHVCC, avctx->extradata, avctx->extradata_size);
260 status_t setVP8Format(AVCodecContext *avctx __unused, MetaDataBase &meta)
264 meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_VP8);
269 status_t setVP9Format(AVCodecContext *avctx __unused, MetaDataBase &meta)
273 meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_VP9);
280 status_t setMP2Format(AVCodecContext *avctx __unused, MetaDataBase &meta)
284 meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_II);
289 status_t setMP3Format(AVCodecContext *avctx __unused, MetaDataBase &meta)
293 meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_MPEG);
298 status_t setVORBISFormat(AVCodecContext *avctx, MetaDataBase &meta)
302 const uint8_t *header_start[3];
304 if (avpriv_split_xiph_headers(avctx->extradata,
305 avctx->extradata_size, 30,
306 header_start, header_len) < 0) {
307 ALOGE("vorbis extradata corrupt.");
308 return UNKNOWN_ERROR;
311 meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_VORBIS);
312 //identification header
313 meta.setData(kKeyVorbisInfo, 0, header_start[0], header_len[0]);
315 meta.setData(kKeyVorbisBooks, 0, header_start[2], header_len[2]);
320 status_t setAC3Format(AVCodecContext *avctx __unused, MetaDataBase &meta)
324 meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AC3);
329 status_t setAACFormat(AVCodecContext *avctx, MetaDataBase &meta)
333 meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AAC);
334 meta.setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
335 meta.setInt32(kKeyAACAOT, avctx->profile + 1);
340 status_t setWMAV1Format(AVCodecContext *avctx, MetaDataBase &meta)
344 meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_WMA);
345 meta.setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
346 meta.setInt32(kKeyWMAVersion, kTypeWMA); //FIXME version?
351 status_t setWMAV2Format(AVCodecContext *avctx, MetaDataBase &meta)
355 meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_WMA);
356 meta.setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
357 meta.setInt32(kKeyWMAVersion, kTypeWMA);
362 status_t setWMAProFormat(AVCodecContext *avctx, MetaDataBase &meta)
366 meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_WMA);
367 meta.setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
368 meta.setInt32(kKeyWMAVersion, kTypeWMAPro);
373 status_t setWMALossLessFormat(AVCodecContext *avctx, MetaDataBase &meta)
375 ALOGV("WMALOSSLESS");
377 meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_WMA);
378 meta.setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
379 meta.setInt32(kKeyWMAVersion, kTypeWMALossLess);
384 status_t setRAFormat(AVCodecContext *avctx, MetaDataBase &meta)
388 meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_RA);
389 meta.setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
394 status_t setALACFormat(AVCodecContext *avctx, MetaDataBase &meta)
398 meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_ALAC);
399 meta.setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
404 status_t setAPEFormat(AVCodecContext *avctx, MetaDataBase &meta)
408 meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_APE);
409 meta.setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
414 status_t setDTSFormat(AVCodecContext *avctx, MetaDataBase &meta)
418 meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_DTS);
419 meta.setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
424 status_t setFLACFormat(AVCodecContext *avctx, MetaDataBase &meta)
428 meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_FLAC);
429 meta.setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
431 if (avctx->extradata_size < 10) {
432 ALOGE("Invalid extradata in FLAC file! (size=%d)", avctx->extradata_size);
433 return UNKNOWN_ERROR;
436 ABitReader br(avctx->extradata, avctx->extradata_size);
437 int32_t minBlockSize = br.getBits(16);
438 int32_t maxBlockSize = br.getBits(16);
439 int32_t minFrameSize = br.getBits(24);
440 int32_t maxFrameSize = br.getBits(24);
442 meta.setInt32('mibs', minBlockSize);
443 meta.setInt32('mabs', maxBlockSize);
444 meta.setInt32('mifs', minFrameSize);
445 meta.setInt32('mafs', maxFrameSize);
450 //Convert H.264 NAL format to annex b
451 status_t convertNal2AnnexB(uint8_t *dst, size_t dst_size,
452 uint8_t *src, size_t src_size, size_t nal_len_size)
456 status_t status = OK;
458 CHECK_EQ(dst_size, src_size);
459 CHECK(nal_len_size == 3 || nal_len_size == 4);
461 while (src_size >= nal_len_size) {
463 for( i = 0; i < nal_len_size; i++ ) {
464 nal_len = (nal_len << 8) | src[i];
467 dst[nal_len_size - 1] = 1;
468 if (nal_len > INT_MAX || nal_len > src_size) {
469 status = ERROR_MALFORMED;
474 src_size -= nal_len_size;
476 memcpy(dst, src, nal_len);
486 int getDivXVersion(AVCodecContext *avctx)
488 if (avctx->codec_tag == AV_RL32("DIV3")
489 || avctx->codec_tag == AV_RL32("div3")
490 || avctx->codec_tag == AV_RL32("DIV4")
491 || avctx->codec_tag == AV_RL32("div4")) {
492 return kTypeDivXVer_3_11;
494 if (avctx->codec_tag == AV_RL32("DIVX")
495 || avctx->codec_tag == AV_RL32("divx")) {
496 return kTypeDivXVer_4;
498 if (avctx->codec_tag == AV_RL32("DX50")
499 || avctx->codec_tag == AV_RL32("dx50")) {
500 return kTypeDivXVer_5;
505 status_t parseMetadataTags(AVFormatContext *ctx, MetaDataBase &meta) {
510 AVDictionary *dict = ctx->metadata;
515 struct MetadataMapping {
520 // avformat -> android mapping
521 static const MetadataMapping kMap[] = {
522 { "track", kKeyCDTrackNumber },
523 { "disc", kKeyDiscNumber },
524 { "album", kKeyAlbum },
525 { "artist", kKeyArtist },
526 { "album_artist", kKeyAlbumArtist },
527 { "composer", kKeyComposer },
528 { "date", kKeyDate },
529 { "genre", kKeyGenre },
530 { "title", kKeyTitle },
531 { "year", kKeyYear },
532 { "compilation", kKeyCompilation },
533 { "location", kKeyLocation },
536 static const size_t kNumEntries = sizeof(kMap) / sizeof(kMap[0]);
538 for (size_t i = 0; i < kNumEntries; ++i) {
539 AVDictionaryEntry *entry = av_dict_get(dict, kMap[i].from, NULL, 0);
541 ALOGV("found key %s with value %s", entry->key, entry->value);
542 meta.setCString(kMap[i].to, entry->value);
546 // now look for album art- this will be in a separate stream
547 for (size_t i = 0; i < ctx->nb_streams; i++) {
548 if (ctx->streams[i]->disposition & AV_DISPOSITION_ATTACHED_PIC) {
549 AVPacket pkt = ctx->streams[i]->attached_pic;
551 if (ctx->streams[i]->codec != NULL) {
553 if (ctx->streams[i]->codec->codec_id == AV_CODEC_ID_MJPEG) {
554 mime = MEDIA_MIMETYPE_IMAGE_JPEG;
555 } else if (ctx->streams[i]->codec->codec_id == AV_CODEC_ID_PNG) {
561 ALOGV("found albumart in stream %zu with type %s len %d", i, mime, pkt.size);
562 meta.setData(kKeyAlbumArt, MetaData::TYPE_NONE, pkt.data, pkt.size);
563 meta.setCString(kKeyAlbumArtMIME, mime);
572 AudioEncoding sampleFormatToEncoding(AVSampleFormat fmt) {
574 // we resample planar formats to interleaved
576 case AV_SAMPLE_FMT_U8:
577 case AV_SAMPLE_FMT_U8P:
578 return kAudioEncodingPcm8bit;
579 case AV_SAMPLE_FMT_S16:
580 case AV_SAMPLE_FMT_S16P:
581 return kAudioEncodingPcm16bit;
582 case AV_SAMPLE_FMT_FLT:
583 case AV_SAMPLE_FMT_FLTP:
584 return kAudioEncodingPcmFloat;
585 case AV_SAMPLE_FMT_DBL:
586 case AV_SAMPLE_FMT_DBLP:
587 return kAudioEncodingPcmFloat;
589 return kAudioEncodingInvalid;
594 AVSampleFormat encodingToSampleFormat(AudioEncoding encoding) {
596 case kAudioEncodingPcm8bit:
597 return AV_SAMPLE_FMT_U8;
598 case kAudioEncodingPcm16bit:
599 return AV_SAMPLE_FMT_S16;
600 case kAudioEncodingPcmFloat:
601 return AV_SAMPLE_FMT_FLT;
603 return AV_SAMPLE_FMT_NONE;
607 } // namespace android