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>
25 #include "libavcodec/xiph.h"
31 #include <utils/Errors.h>
32 #include <media/stagefright/foundation/ADebug.h>
33 #include <media/stagefright/MediaDefs.h>
34 #include <media/stagefright/MediaErrors.h>
35 #include <media/stagefright/MetaData.h>
36 #include "include/avc_utils.h"
38 #include "codec_utils.h"
42 static void EncodeSize14(uint8_t **_ptr, size_t size) {
43 CHECK_LE(size, 0x3fff);
47 *ptr++ = 0x80 | (size >> 7);
53 static sp<ABuffer> MakeMPEGVideoESDS(const sp<ABuffer> &csd) {
54 sp<ABuffer> esds = new ABuffer(csd->size() + 25);
56 uint8_t *ptr = esds->data();
58 EncodeSize14(&ptr, 22 + csd->size());
60 *ptr++ = 0x00; // ES_ID
63 *ptr++ = 0x00; // streamDependenceFlag, URL_Flag, OCRstreamFlag
66 EncodeSize14(&ptr, 16 + csd->size());
68 *ptr++ = 0x40; // Audio ISO/IEC 14496-3
70 for (size_t i = 0; i < 12; ++i) {
75 EncodeSize14(&ptr, csd->size());
77 memcpy(ptr, csd->data(), csd->size());
82 //Returns the sample rate based on the sampling frequency index
83 static uint32_t getAACSampleRate(const uint8_t sf_index)
85 static const uint32_t sample_rates[] =
87 96000, 88200, 64000, 48000, 44100, 32000,
88 24000, 22050, 16000, 12000, 11025, 8000
91 if (sf_index < sizeof(sample_rates) / sizeof(sample_rates[0])) {
92 return sample_rates[sf_index];
101 //http://msdn.microsoft.com/en-us/library/dd757808(v=vs.85).aspx
103 // H.264 bitstream without start codes.
104 sp<MetaData> setAVCFormat(AVCodecContext *avctx)
108 CHECK_EQ(avctx->codec_id, AV_CODEC_ID_H264);
109 CHECK_GT(avctx->extradata_size, 0);
110 CHECK_EQ(avctx->extradata[0], 1); //configurationVersion
112 if (avctx->width == 0 || avctx->height == 0) {
113 int32_t width, height;
114 sp<ABuffer> seqParamSet = new ABuffer(avctx->extradata_size - 8);
115 memcpy(seqParamSet->data(), avctx->extradata + 8, avctx->extradata_size - 8);
116 FindAVCDimensions(seqParamSet, &width, &height);
117 avctx->width = width;
118 avctx->height = height;
121 sp<MetaData> meta = new MetaData;
122 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC);
123 meta->setData(kKeyAVCC, kTypeAVCC, avctx->extradata, avctx->extradata_size);
128 // H.264 bitstream with start codes.
129 sp<MetaData> setH264Format(AVCodecContext *avctx)
133 CHECK_EQ(avctx->codec_id, AV_CODEC_ID_H264);
134 CHECK_NE(avctx->extradata[0], 1); //configurationVersion
136 sp<ABuffer> buffer = new ABuffer(avctx->extradata_size);
137 memcpy(buffer->data(), avctx->extradata, avctx->extradata_size);
138 return MakeAVCCodecSpecificData(buffer);
141 sp<MetaData> setMPEG4Format(AVCodecContext *avctx)
145 sp<ABuffer> csd = new ABuffer(avctx->extradata_size);
146 memcpy(csd->data(), avctx->extradata, avctx->extradata_size);
147 sp<ABuffer> esds = MakeMPEGVideoESDS(csd);
149 sp<MetaData> meta = new MetaData;
150 meta->setData(kKeyESDS, kTypeESDS, esds->data(), esds->size());
151 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_MPEG4);
156 sp<MetaData> setH263Format(AVCodecContext *avctx)
160 sp<MetaData> meta = new MetaData;
161 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_H263);
166 sp<MetaData> setMPEG2VIDEOFormat(AVCodecContext *avctx)
168 ALOGV("MPEG%uVIDEO", avctx->codec_id == AV_CODEC_ID_MPEG2VIDEO ? 2 : 1);
170 sp<ABuffer> csd = new ABuffer(avctx->extradata_size);
171 memcpy(csd->data(), avctx->extradata, avctx->extradata_size);
172 sp<ABuffer> esds = MakeMPEGVideoESDS(csd);
174 sp<MetaData> meta = new MetaData;
175 meta->setData(kKeyESDS, kTypeESDS, esds->data(), esds->size());
176 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_MPEG2);
181 sp<MetaData> setVC1Format(AVCodecContext *avctx)
185 sp<MetaData> meta = new MetaData;
186 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_VC1);
187 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
192 sp<MetaData> setWMV1Format(AVCodecContext *avctx)
196 sp<MetaData> meta = new MetaData;
197 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_WMV);
198 meta->setInt32(kKeyWMVVersion, kTypeWMVVer_7);
203 sp<MetaData> setWMV2Format(AVCodecContext *avctx)
207 sp<MetaData> meta = new MetaData;
208 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_WMV);
209 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
210 meta->setInt32(kKeyWMVVersion, kTypeWMVVer_8);
215 sp<MetaData> setWMV3Format(AVCodecContext *avctx)
219 sp<MetaData> meta = new MetaData;
220 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_WMV);
221 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
222 meta->setInt32(kKeyWMVVersion, kTypeWMVVer_9);
227 sp<MetaData> setRV20Format(AVCodecContext *avctx)
231 sp<MetaData> meta = new MetaData;
232 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RV);
233 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
234 meta->setInt32(kKeyRVVersion, kTypeRVVer_G2); //http://en.wikipedia.org/wiki/RealVide
239 sp<MetaData> setRV30Format(AVCodecContext *avctx)
243 sp<MetaData> meta = new MetaData;
244 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RV);
245 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
246 meta->setInt32(kKeyRVVersion, kTypeRVVer_8); //http://en.wikipedia.org/wiki/RealVide
251 sp<MetaData> setRV40Format(AVCodecContext *avctx)
255 sp<MetaData> meta = new MetaData;
256 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RV);
257 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
258 meta->setInt32(kKeyRVVersion, kTypeRVVer_9); //http://en.wikipedia.org/wiki/RealVide
263 sp<MetaData> setFLV1Format(AVCodecContext *avctx)
265 ALOGV("FLV1(Sorenson H263)");
267 sp<MetaData> meta = new MetaData;
268 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_FLV1);
269 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
274 sp<MetaData> setHEVCFormat(AVCodecContext *avctx)
278 sp<MetaData> meta = new MetaData;
279 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_HEVC);
280 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
287 sp<MetaData> setMP2Format(AVCodecContext *avctx)
291 sp<MetaData> meta = new MetaData;
292 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_II);
297 sp<MetaData> setMP3Format(AVCodecContext *avctx)
301 sp<MetaData> meta = new MetaData;
302 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_MPEG);
307 sp<MetaData> setVORBISFormat(AVCodecContext *avctx)
311 uint8_t *header_start[3];
313 if (avpriv_split_xiph_headers(avctx->extradata,
314 avctx->extradata_size, 30,
315 header_start, header_len) < 0) {
316 ALOGE("vorbis extradata corrupt.");
320 sp<MetaData> meta = new MetaData;
321 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_VORBIS);
322 //identification header
323 meta->setData(kKeyVorbisInfo, 0, header_start[0], header_len[0]);
325 meta->setData(kKeyVorbisBooks, 0, header_start[2], header_len[2]);
330 sp<MetaData> setAC3Format(AVCodecContext *avctx)
334 sp<MetaData> meta = new MetaData;
335 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AC3);
340 sp<MetaData> setAACFormat(AVCodecContext *avctx)
345 const uint8_t *header;
346 uint8_t profile, sf_index, channel;
348 header = avctx->extradata;
349 CHECK(header != NULL);
351 // AudioSpecificInfo follows
352 // oooo offf fccc c000
353 // o - audioObjectType
354 // f - samplingFreqIndex
356 profile = ((header[0] & 0xf8) >> 3) - 1;
357 sf_index = (header[0] & 0x07) << 1 | (header[1] & 0x80) >> 7;
358 sr = getAACSampleRate(sf_index);
360 ALOGE("unsupport the aac sample rate");
363 channel = (header[1] >> 3) & 0xf;
364 ALOGV("aac profile: %d, sf_index: %d, channel: %d", profile, sf_index, channel);
366 sp<MetaData> meta = MakeAACCodecSpecificData(profile, sf_index, channel);
367 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AAC);
372 sp<MetaData> setWMAV1Format(AVCodecContext *avctx)
376 sp<MetaData> meta = new MetaData;
377 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_WMA);
378 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
379 meta->setInt32(kKeyWMAVersion, kTypeWMA); //FIXME version?
384 sp<MetaData> setWMAV2Format(AVCodecContext *avctx)
388 sp<MetaData> meta = new MetaData;
389 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_WMA);
390 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
391 meta->setInt32(kKeyWMAVersion, kTypeWMA);
396 sp<MetaData> setWMAProFormat(AVCodecContext *avctx)
400 sp<MetaData> meta = new MetaData;
401 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_WMA);
402 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
403 meta->setInt32(kKeyWMAVersion, kTypeWMAPro);
408 sp<MetaData> setWMALossLessFormat(AVCodecContext *avctx)
410 ALOGV("WMALOSSLESS");
412 sp<MetaData> meta = new MetaData;
413 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_WMA);
414 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
415 meta->setInt32(kKeyWMAVersion, kTypeWMALossLess);
420 sp<MetaData> setRAFormat(AVCodecContext *avctx)
424 sp<MetaData> meta = new MetaData;
425 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_RA);
426 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
431 sp<MetaData> setAPEFormat(AVCodecContext *avctx)
435 sp<MetaData> meta = new MetaData;
436 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_APE);
437 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
442 sp<MetaData> setDTSFormat(AVCodecContext *avctx)
446 sp<MetaData> meta = new MetaData;
447 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_DTS);
448 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
453 sp<MetaData> setFLACFormat(AVCodecContext *avctx)
457 sp<MetaData> meta = new MetaData;
458 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_FLAC);
459 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
464 //Convert H.264 NAL format to annex b
465 status_t convertNal2AnnexB(uint8_t *dst, size_t dst_size,
466 uint8_t *src, size_t src_size, size_t nal_len_size)
470 status_t status = OK;
472 CHECK_EQ(dst_size, src_size);
473 CHECK(nal_len_size == 3 || nal_len_size == 4);
475 while (src_size >= nal_len_size) {
477 for( i = 0; i < nal_len_size; i++ ) {
478 nal_len = (nal_len << 8) | src[i];
481 dst[nal_len_size - 1] = 1;
482 if (nal_len > INT_MAX || nal_len > src_size) {
483 status = ERROR_MALFORMED;
488 src_size -= nal_len_size;
490 memcpy(dst, src, nal_len);
500 } // namespace android