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_NDEBUG 0
18 #define LOG_TAG "codec_utils"
19 #include <utils/Log.h>
26 #include "libavcodec/xiph.h"
27 #include "libavutil/intreadwrite.h"
33 #include <utils/Errors.h>
34 #include <media/stagefright/foundation/ABitReader.h>
35 #include <media/stagefright/foundation/ADebug.h>
36 #include <media/stagefright/MediaDefs.h>
37 #include <media/stagefright/MediaErrors.h>
38 #include <media/stagefright/MetaData.h>
39 #include "include/avc_utils.h"
41 #include "codec_utils.h"
45 static void EncodeSize14(uint8_t **_ptr, size_t size) {
46 CHECK_LE(size, 0x3fff);
50 *ptr++ = 0x80 | (size >> 7);
56 static sp<ABuffer> MakeMPEGVideoESDS(const sp<ABuffer> &csd) {
57 sp<ABuffer> esds = new ABuffer(csd->size() + 25);
59 uint8_t *ptr = esds->data();
61 EncodeSize14(&ptr, 22 + csd->size());
63 *ptr++ = 0x00; // ES_ID
66 *ptr++ = 0x00; // streamDependenceFlag, URL_Flag, OCRstreamFlag
69 EncodeSize14(&ptr, 16 + csd->size());
71 *ptr++ = 0x40; // Audio ISO/IEC 14496-3
73 for (size_t i = 0; i < 12; ++i) {
78 EncodeSize14(&ptr, csd->size());
80 memcpy(ptr, csd->data(), csd->size());
85 //Returns the sample rate based on the sampling frequency index
86 static uint32_t getAACSampleRate(const uint8_t sf_index)
88 static const uint32_t sample_rates[] =
90 96000, 88200, 64000, 48000, 44100, 32000,
91 24000, 22050, 16000, 12000, 11025, 8000
94 if (sf_index < sizeof(sample_rates) / sizeof(sample_rates[0])) {
95 return sample_rates[sf_index];
104 //http://msdn.microsoft.com/en-us/library/dd757808(v=vs.85).aspx
106 // H.264 bitstream without start codes.
107 sp<MetaData> setAVCFormat(AVCodecContext *avctx)
111 CHECK_EQ(avctx->codec_id, AV_CODEC_ID_H264);
112 CHECK_GT(avctx->extradata_size, 0);
113 CHECK_EQ(avctx->extradata[0], 1); //configurationVersion
115 if (avctx->width == 0 || avctx->height == 0) {
116 int32_t width, height;
117 sp<ABuffer> seqParamSet = new ABuffer(avctx->extradata_size - 8);
118 memcpy(seqParamSet->data(), avctx->extradata + 8, avctx->extradata_size - 8);
119 FindAVCDimensions(seqParamSet, &width, &height);
120 avctx->width = width;
121 avctx->height = height;
124 sp<MetaData> meta = new MetaData;
125 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC);
126 meta->setData(kKeyAVCC, kTypeAVCC, avctx->extradata, avctx->extradata_size);
131 // H.264 bitstream with start codes.
132 sp<MetaData> setH264Format(AVCodecContext *avctx)
136 CHECK_EQ(avctx->codec_id, AV_CODEC_ID_H264);
137 CHECK_NE(avctx->extradata[0], 1); //configurationVersion
139 sp<ABuffer> buffer = new ABuffer(avctx->extradata_size);
140 memcpy(buffer->data(), avctx->extradata, avctx->extradata_size);
141 return MakeAVCCodecSpecificData(buffer);
144 sp<MetaData> setMPEG4Format(AVCodecContext *avctx)
148 sp<ABuffer> csd = new ABuffer(avctx->extradata_size);
149 memcpy(csd->data(), avctx->extradata, avctx->extradata_size);
150 sp<ABuffer> esds = MakeMPEGVideoESDS(csd);
152 sp<MetaData> meta = new MetaData;
153 meta->setData(kKeyESDS, kTypeESDS, esds->data(), esds->size());
155 int divxVersion = getDivXVersion(avctx);
156 if (divxVersion >= 0) {
157 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_DIVX);
158 meta->setInt32(kKeyDivXVersion, divxVersion);
160 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_MPEG4);
165 sp<MetaData> setH263Format(AVCodecContext *avctx __unused)
169 sp<MetaData> meta = new MetaData;
170 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_H263);
175 sp<MetaData> setMPEG2VIDEOFormat(AVCodecContext *avctx)
177 ALOGV("MPEG%uVIDEO", avctx->codec_id == AV_CODEC_ID_MPEG2VIDEO ? 2 : 1);
179 sp<ABuffer> csd = new ABuffer(avctx->extradata_size);
180 memcpy(csd->data(), avctx->extradata, avctx->extradata_size);
181 sp<ABuffer> esds = MakeMPEGVideoESDS(csd);
183 sp<MetaData> meta = new MetaData;
184 meta->setData(kKeyESDS, kTypeESDS, esds->data(), esds->size());
185 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_MPEG2);
190 sp<MetaData> setVC1Format(AVCodecContext *avctx)
194 sp<MetaData> meta = new MetaData;
195 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_VC1);
196 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
201 sp<MetaData> setWMV1Format(AVCodecContext *avctx __unused)
205 sp<MetaData> meta = new MetaData;
206 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_WMV);
207 meta->setInt32(kKeyWMVVersion, kTypeWMVVer_7);
212 sp<MetaData> setWMV2Format(AVCodecContext *avctx)
216 sp<MetaData> meta = new MetaData;
217 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_WMV);
218 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
219 meta->setInt32(kKeyWMVVersion, kTypeWMVVer_8);
224 sp<MetaData> setWMV3Format(AVCodecContext *avctx)
228 sp<MetaData> meta = new MetaData;
229 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_WMV);
230 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
231 meta->setInt32(kKeyWMVVersion, kTypeWMVVer_9);
236 sp<MetaData> setRV20Format(AVCodecContext *avctx)
240 sp<MetaData> meta = new MetaData;
241 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RV);
242 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
243 meta->setInt32(kKeyRVVersion, kTypeRVVer_G2); //http://en.wikipedia.org/wiki/RealVide
248 sp<MetaData> setRV30Format(AVCodecContext *avctx)
252 sp<MetaData> meta = new MetaData;
253 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RV);
254 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
255 meta->setInt32(kKeyRVVersion, kTypeRVVer_8); //http://en.wikipedia.org/wiki/RealVide
260 sp<MetaData> setRV40Format(AVCodecContext *avctx)
264 sp<MetaData> meta = new MetaData;
265 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RV);
266 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
267 meta->setInt32(kKeyRVVersion, kTypeRVVer_9); //http://en.wikipedia.org/wiki/RealVide
272 sp<MetaData> setFLV1Format(AVCodecContext *avctx)
274 ALOGV("FLV1(Sorenson H263)");
276 sp<MetaData> meta = new MetaData;
277 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_FLV1);
278 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
283 sp<MetaData> setHEVCFormat(AVCodecContext *avctx)
287 sp<MetaData> meta = new MetaData;
288 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_HEVC);
289 meta->setData(kKeyHVCC, 0, avctx->extradata, avctx->extradata_size);
294 sp<MetaData> setVP8Format(AVCodecContext *avctx __unused)
298 sp<MetaData> meta = new MetaData;
299 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_VP8);
304 sp<MetaData> setVP9Format(AVCodecContext *avctx __unused)
308 sp<MetaData> meta = new MetaData;
309 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_VP9);
316 sp<MetaData> setMP2Format(AVCodecContext *avctx __unused)
320 sp<MetaData> meta = new MetaData;
321 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_II);
326 sp<MetaData> setMP3Format(AVCodecContext *avctx __unused)
330 sp<MetaData> meta = new MetaData;
331 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_MPEG);
336 sp<MetaData> setVORBISFormat(AVCodecContext *avctx)
340 const uint8_t *header_start[3];
342 if (avpriv_split_xiph_headers(avctx->extradata,
343 avctx->extradata_size, 30,
344 header_start, header_len) < 0) {
345 ALOGE("vorbis extradata corrupt.");
349 sp<MetaData> meta = new MetaData;
350 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_VORBIS);
351 //identification header
352 meta->setData(kKeyVorbisInfo, 0, header_start[0], header_len[0]);
354 meta->setData(kKeyVorbisBooks, 0, header_start[2], header_len[2]);
359 sp<MetaData> setAC3Format(AVCodecContext *avctx __unused)
363 sp<MetaData> meta = new MetaData;
364 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AC3);
369 sp<MetaData> setAACFormat(AVCodecContext *avctx)
374 const uint8_t *header;
375 uint8_t profile, sf_index, channel;
377 header = avctx->extradata;
378 CHECK(header != NULL);
380 // AudioSpecificInfo follows
381 // oooo offf fccc c000
382 // o - audioObjectType
383 // f - samplingFreqIndex
385 profile = ((header[0] & 0xf8) >> 3) - 1;
386 sf_index = (header[0] & 0x07) << 1 | (header[1] & 0x80) >> 7;
387 sr = getAACSampleRate(sf_index);
389 ALOGE("unsupport the aac sample rate");
392 channel = (header[1] >> 3) & 0xf;
393 ALOGV("aac profile: %d, sf_index: %d, channel: %d", profile, sf_index, channel);
395 sp<MetaData> meta = MakeAACCodecSpecificData(profile, sf_index, channel);
396 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AAC);
397 meta->setInt32(kKeyAACAOT, profile);
401 sp<MetaData> setWMAV1Format(AVCodecContext *avctx)
405 sp<MetaData> meta = new MetaData;
406 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_WMA);
407 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
408 meta->setInt32(kKeyWMAVersion, kTypeWMA); //FIXME version?
413 sp<MetaData> setWMAV2Format(AVCodecContext *avctx)
417 sp<MetaData> meta = new MetaData;
418 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_WMA);
419 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
420 meta->setInt32(kKeyWMAVersion, kTypeWMA);
425 sp<MetaData> setWMAProFormat(AVCodecContext *avctx)
429 sp<MetaData> meta = new MetaData;
430 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_WMA);
431 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
432 meta->setInt32(kKeyWMAVersion, kTypeWMAPro);
437 sp<MetaData> setWMALossLessFormat(AVCodecContext *avctx)
439 ALOGV("WMALOSSLESS");
441 sp<MetaData> meta = new MetaData;
442 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_WMA);
443 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
444 meta->setInt32(kKeyWMAVersion, kTypeWMALossLess);
449 sp<MetaData> setRAFormat(AVCodecContext *avctx)
453 sp<MetaData> meta = new MetaData;
454 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_RA);
455 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
460 sp<MetaData> setAPEFormat(AVCodecContext *avctx)
464 sp<MetaData> meta = new MetaData;
465 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_APE);
466 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
471 sp<MetaData> setDTSFormat(AVCodecContext *avctx)
475 sp<MetaData> meta = new MetaData;
476 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_DTS);
477 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
482 sp<MetaData> setFLACFormat(AVCodecContext *avctx)
486 sp<MetaData> meta = new MetaData;
487 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_FLAC);
488 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
490 ABitReader br(avctx->extradata, avctx->extradata_size);
491 int32_t minBlockSize = br.getBits(16);
492 int32_t maxBlockSize = br.getBits(16);
493 int32_t minFrameSize = br.getBits(24);
494 int32_t maxFrameSize = br.getBits(24);
496 meta->setInt32('mibs', minBlockSize);
497 meta->setInt32('mabs', maxBlockSize);
498 meta->setInt32('mifs', minFrameSize);
499 meta->setInt32('mafs', maxFrameSize);
504 //Convert H.264 NAL format to annex b
505 status_t convertNal2AnnexB(uint8_t *dst, size_t dst_size,
506 uint8_t *src, size_t src_size, size_t nal_len_size)
510 status_t status = OK;
512 CHECK_EQ(dst_size, src_size);
513 CHECK(nal_len_size == 3 || nal_len_size == 4);
515 while (src_size >= nal_len_size) {
517 for( i = 0; i < nal_len_size; i++ ) {
518 nal_len = (nal_len << 8) | src[i];
521 dst[nal_len_size - 1] = 1;
522 if (nal_len > INT_MAX || nal_len > src_size) {
523 status = ERROR_MALFORMED;
528 src_size -= nal_len_size;
530 memcpy(dst, src, nal_len);
540 int getDivXVersion(AVCodecContext *avctx)
542 if (avctx->codec_tag == AV_RL32("DIV3")
543 || avctx->codec_tag == AV_RL32("div3")
544 || avctx->codec_tag == AV_RL32("DIV4")
545 || avctx->codec_tag == AV_RL32("div4")) {
546 return kTypeDivXVer_3_11;
548 if (avctx->codec_tag == AV_RL32("DIVX")
549 || avctx->codec_tag == AV_RL32("divx")) {
550 return kTypeDivXVer_4;
552 if (avctx->codec_tag == AV_RL32("DX50")
553 || avctx->codec_tag == AV_RL32("dx50")) {
554 return kTypeDivXVer_5;
559 } // namespace android