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/ADebug.h>
35 #include <media/stagefright/MediaDefs.h>
36 #include <media/stagefright/MediaErrors.h>
37 #include <media/stagefright/MetaData.h>
38 #include "include/avc_utils.h"
40 #include "codec_utils.h"
44 static void EncodeSize14(uint8_t **_ptr, size_t size) {
45 CHECK_LE(size, 0x3fff);
49 *ptr++ = 0x80 | (size >> 7);
55 static sp<ABuffer> MakeMPEGVideoESDS(const sp<ABuffer> &csd) {
56 sp<ABuffer> esds = new ABuffer(csd->size() + 25);
58 uint8_t *ptr = esds->data();
60 EncodeSize14(&ptr, 22 + csd->size());
62 *ptr++ = 0x00; // ES_ID
65 *ptr++ = 0x00; // streamDependenceFlag, URL_Flag, OCRstreamFlag
68 EncodeSize14(&ptr, 16 + csd->size());
70 *ptr++ = 0x40; // Audio ISO/IEC 14496-3
72 for (size_t i = 0; i < 12; ++i) {
77 EncodeSize14(&ptr, csd->size());
79 memcpy(ptr, csd->data(), csd->size());
84 //Returns the sample rate based on the sampling frequency index
85 static uint32_t getAACSampleRate(const uint8_t sf_index)
87 static const uint32_t sample_rates[] =
89 96000, 88200, 64000, 48000, 44100, 32000,
90 24000, 22050, 16000, 12000, 11025, 8000
93 if (sf_index < sizeof(sample_rates) / sizeof(sample_rates[0])) {
94 return sample_rates[sf_index];
103 //http://msdn.microsoft.com/en-us/library/dd757808(v=vs.85).aspx
105 // H.264 bitstream without start codes.
106 sp<MetaData> setAVCFormat(AVCodecContext *avctx)
110 CHECK_EQ(avctx->codec_id, AV_CODEC_ID_H264);
111 CHECK_GT(avctx->extradata_size, 0);
112 CHECK_EQ(avctx->extradata[0], 1); //configurationVersion
114 if (avctx->width == 0 || avctx->height == 0) {
115 int32_t width, height;
116 sp<ABuffer> seqParamSet = new ABuffer(avctx->extradata_size - 8);
117 memcpy(seqParamSet->data(), avctx->extradata + 8, avctx->extradata_size - 8);
118 FindAVCDimensions(seqParamSet, &width, &height);
119 avctx->width = width;
120 avctx->height = height;
123 sp<MetaData> meta = new MetaData;
124 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC);
125 meta->setData(kKeyAVCC, kTypeAVCC, avctx->extradata, avctx->extradata_size);
130 // H.264 bitstream with start codes.
131 sp<MetaData> setH264Format(AVCodecContext *avctx)
135 CHECK_EQ(avctx->codec_id, AV_CODEC_ID_H264);
136 CHECK_NE(avctx->extradata[0], 1); //configurationVersion
138 sp<ABuffer> buffer = new ABuffer(avctx->extradata_size);
139 memcpy(buffer->data(), avctx->extradata, avctx->extradata_size);
140 return MakeAVCCodecSpecificData(buffer);
143 sp<MetaData> setMPEG4Format(AVCodecContext *avctx)
147 sp<ABuffer> csd = new ABuffer(avctx->extradata_size);
148 memcpy(csd->data(), avctx->extradata, avctx->extradata_size);
149 sp<ABuffer> esds = MakeMPEGVideoESDS(csd);
151 sp<MetaData> meta = new MetaData;
152 meta->setData(kKeyESDS, kTypeESDS, esds->data(), esds->size());
154 int divxVersion = getDivXVersion(avctx);
155 if (divxVersion >= 0) {
156 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_DIVX);
157 meta->setInt32(kKeyDivXVersion, divxVersion);
159 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_MPEG4);
164 sp<MetaData> setH263Format(AVCodecContext *avctx __unused)
168 sp<MetaData> meta = new MetaData;
169 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_H263);
174 sp<MetaData> setMPEG2VIDEOFormat(AVCodecContext *avctx)
176 ALOGV("MPEG%uVIDEO", avctx->codec_id == AV_CODEC_ID_MPEG2VIDEO ? 2 : 1);
178 sp<ABuffer> csd = new ABuffer(avctx->extradata_size);
179 memcpy(csd->data(), avctx->extradata, avctx->extradata_size);
180 sp<ABuffer> esds = MakeMPEGVideoESDS(csd);
182 sp<MetaData> meta = new MetaData;
183 meta->setData(kKeyESDS, kTypeESDS, esds->data(), esds->size());
184 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_MPEG2);
189 sp<MetaData> setVC1Format(AVCodecContext *avctx)
193 sp<MetaData> meta = new MetaData;
194 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_VC1);
195 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
200 sp<MetaData> setWMV1Format(AVCodecContext *avctx __unused)
204 sp<MetaData> meta = new MetaData;
205 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_WMV);
206 meta->setInt32(kKeyWMVVersion, kTypeWMVVer_7);
211 sp<MetaData> setWMV2Format(AVCodecContext *avctx)
215 sp<MetaData> meta = new MetaData;
216 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_WMV);
217 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
218 meta->setInt32(kKeyWMVVersion, kTypeWMVVer_8);
223 sp<MetaData> setWMV3Format(AVCodecContext *avctx)
227 sp<MetaData> meta = new MetaData;
228 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_WMV);
229 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
230 meta->setInt32(kKeyWMVVersion, kTypeWMVVer_9);
235 sp<MetaData> setRV20Format(AVCodecContext *avctx)
239 sp<MetaData> meta = new MetaData;
240 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RV);
241 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
242 meta->setInt32(kKeyRVVersion, kTypeRVVer_G2); //http://en.wikipedia.org/wiki/RealVide
247 sp<MetaData> setRV30Format(AVCodecContext *avctx)
251 sp<MetaData> meta = new MetaData;
252 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RV);
253 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
254 meta->setInt32(kKeyRVVersion, kTypeRVVer_8); //http://en.wikipedia.org/wiki/RealVide
259 sp<MetaData> setRV40Format(AVCodecContext *avctx)
263 sp<MetaData> meta = new MetaData;
264 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RV);
265 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
266 meta->setInt32(kKeyRVVersion, kTypeRVVer_9); //http://en.wikipedia.org/wiki/RealVide
271 sp<MetaData> setFLV1Format(AVCodecContext *avctx)
273 ALOGV("FLV1(Sorenson H263)");
275 sp<MetaData> meta = new MetaData;
276 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_FLV1);
277 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
282 sp<MetaData> setHEVCFormat(AVCodecContext *avctx)
286 sp<MetaData> meta = new MetaData;
287 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_HEVC);
288 meta->setData(kKeyHVCC, 0, avctx->extradata, avctx->extradata_size);
293 sp<MetaData> setVP8Format(AVCodecContext *avctx __unused)
297 sp<MetaData> meta = new MetaData;
298 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_VP8);
303 sp<MetaData> setVP9Format(AVCodecContext *avctx __unused)
307 sp<MetaData> meta = new MetaData;
308 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_VP9);
315 sp<MetaData> setMP2Format(AVCodecContext *avctx __unused)
319 sp<MetaData> meta = new MetaData;
320 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_II);
325 sp<MetaData> setMP3Format(AVCodecContext *avctx __unused)
329 sp<MetaData> meta = new MetaData;
330 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_MPEG);
335 sp<MetaData> setVORBISFormat(AVCodecContext *avctx)
339 const uint8_t *header_start[3];
341 if (avpriv_split_xiph_headers(avctx->extradata,
342 avctx->extradata_size, 30,
343 header_start, header_len) < 0) {
344 ALOGE("vorbis extradata corrupt.");
348 sp<MetaData> meta = new MetaData;
349 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_VORBIS);
350 //identification header
351 meta->setData(kKeyVorbisInfo, 0, header_start[0], header_len[0]);
353 meta->setData(kKeyVorbisBooks, 0, header_start[2], header_len[2]);
358 sp<MetaData> setAC3Format(AVCodecContext *avctx __unused)
362 sp<MetaData> meta = new MetaData;
363 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AC3);
368 sp<MetaData> setAACFormat(AVCodecContext *avctx)
373 const uint8_t *header;
374 uint8_t profile, sf_index, channel;
376 header = avctx->extradata;
377 CHECK(header != NULL);
379 // AudioSpecificInfo follows
380 // oooo offf fccc c000
381 // o - audioObjectType
382 // f - samplingFreqIndex
384 profile = ((header[0] & 0xf8) >> 3) - 1;
385 sf_index = (header[0] & 0x07) << 1 | (header[1] & 0x80) >> 7;
386 sr = getAACSampleRate(sf_index);
388 ALOGE("unsupport the aac sample rate");
391 channel = (header[1] >> 3) & 0xf;
392 ALOGV("aac profile: %d, sf_index: %d, channel: %d", profile, sf_index, channel);
394 sp<MetaData> meta = MakeAACCodecSpecificData(profile, sf_index, channel);
395 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AAC);
396 meta->setInt32(kKeyAACAOT, profile);
400 sp<MetaData> setWMAV1Format(AVCodecContext *avctx)
404 sp<MetaData> meta = new MetaData;
405 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_WMA);
406 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
407 meta->setInt32(kKeyWMAVersion, kTypeWMA); //FIXME version?
412 sp<MetaData> setWMAV2Format(AVCodecContext *avctx)
416 sp<MetaData> meta = new MetaData;
417 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_WMA);
418 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
419 meta->setInt32(kKeyWMAVersion, kTypeWMA);
424 sp<MetaData> setWMAProFormat(AVCodecContext *avctx)
428 sp<MetaData> meta = new MetaData;
429 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_WMA);
430 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
431 meta->setInt32(kKeyWMAVersion, kTypeWMAPro);
436 sp<MetaData> setWMALossLessFormat(AVCodecContext *avctx)
438 ALOGV("WMALOSSLESS");
440 sp<MetaData> meta = new MetaData;
441 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_WMA);
442 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
443 meta->setInt32(kKeyWMAVersion, kTypeWMALossLess);
448 sp<MetaData> setRAFormat(AVCodecContext *avctx)
452 sp<MetaData> meta = new MetaData;
453 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_RA);
454 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
459 sp<MetaData> setAPEFormat(AVCodecContext *avctx)
463 sp<MetaData> meta = new MetaData;
464 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_APE);
465 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
470 sp<MetaData> setDTSFormat(AVCodecContext *avctx)
474 sp<MetaData> meta = new MetaData;
475 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_DTS);
476 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
481 sp<MetaData> setFLACFormat(AVCodecContext *avctx)
485 sp<MetaData> meta = new MetaData;
486 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_FLAC);
487 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
492 //Convert H.264 NAL format to annex b
493 status_t convertNal2AnnexB(uint8_t *dst, size_t dst_size,
494 uint8_t *src, size_t src_size, size_t nal_len_size)
498 status_t status = OK;
500 CHECK_EQ(dst_size, src_size);
501 CHECK(nal_len_size == 3 || nal_len_size == 4);
503 while (src_size >= nal_len_size) {
505 for( i = 0; i < nal_len_size; i++ ) {
506 nal_len = (nal_len << 8) | src[i];
509 dst[nal_len_size - 1] = 1;
510 if (nal_len > INT_MAX || nal_len > src_size) {
511 status = ERROR_MALFORMED;
516 src_size -= nal_len_size;
518 memcpy(dst, src, nal_len);
528 int getDivXVersion(AVCodecContext *avctx)
530 if (avctx->codec_tag == AV_RL32("DIV3")
531 || avctx->codec_tag == AV_RL32("div3")
532 || avctx->codec_tag == AV_RL32("DIV4")
533 || avctx->codec_tag == AV_RL32("div4")) {
534 return kTypeDivXVer_3_11;
536 if (avctx->codec_tag == AV_RL32("DIVX")
537 || avctx->codec_tag == AV_RL32("divx")) {
538 return kTypeDivXVer_4;
540 if (avctx->codec_tag == AV_RL32("DX50")
541 || avctx->codec_tag == AV_RL32("dx50")) {
542 return kTypeDivXVer_5;
547 } // namespace android