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.
18 #define LOG_TAG "codec_utils"
19 #include <utils/Log.h>
26 #include "libavcodec/xiph.h"
32 #include <utils/Errors.h>
33 #include <media/stagefright/foundation/ADebug.h>
34 #include <media/stagefright/MediaDefs.h>
35 #include <media/stagefright/MediaErrors.h>
36 #include <media/stagefright/MetaData.h>
37 #include "include/avc_utils.h"
39 #include "codec_utils.h"
43 static void EncodeSize14(uint8_t **_ptr, size_t size) {
44 CHECK_LE(size, 0x3fff);
48 *ptr++ = 0x80 | (size >> 7);
54 static sp<ABuffer> MakeMPEGVideoESDS(const sp<ABuffer> &csd) {
55 sp<ABuffer> esds = new ABuffer(csd->size() + 25);
57 uint8_t *ptr = esds->data();
59 EncodeSize14(&ptr, 22 + csd->size());
61 *ptr++ = 0x00; // ES_ID
64 *ptr++ = 0x00; // streamDependenceFlag, URL_Flag, OCRstreamFlag
67 EncodeSize14(&ptr, 16 + csd->size());
69 *ptr++ = 0x40; // Audio ISO/IEC 14496-3
71 for (size_t i = 0; i < 12; ++i) {
76 EncodeSize14(&ptr, csd->size());
78 memcpy(ptr, csd->data(), csd->size());
83 //Returns the sample rate based on the sampling frequency index
84 static uint32_t getAACSampleRate(const uint8_t sf_index)
86 static const uint32_t sample_rates[] =
88 96000, 88200, 64000, 48000, 44100, 32000,
89 24000, 22050, 16000, 12000, 11025, 8000
92 if (sf_index < sizeof(sample_rates) / sizeof(sample_rates[0])) {
93 return sample_rates[sf_index];
102 //http://msdn.microsoft.com/en-us/library/dd757808(v=vs.85).aspx
104 // H.264 bitstream without start codes.
105 sp<MetaData> setAVCFormat(AVCodecContext *avctx)
109 CHECK_EQ(avctx->codec_id, AV_CODEC_ID_H264);
110 CHECK_GT(avctx->extradata_size, 0);
111 CHECK_EQ(avctx->extradata[0], 1); //configurationVersion
113 if (avctx->width == 0 || avctx->height == 0) {
114 int32_t width, height;
115 sp<ABuffer> seqParamSet = new ABuffer(avctx->extradata_size - 8);
116 memcpy(seqParamSet->data(), avctx->extradata + 8, avctx->extradata_size - 8);
117 FindAVCDimensions(seqParamSet, &width, &height);
118 avctx->width = width;
119 avctx->height = height;
122 sp<MetaData> meta = new MetaData;
123 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC);
124 meta->setData(kKeyAVCC, kTypeAVCC, avctx->extradata, avctx->extradata_size);
129 // H.264 bitstream with start codes.
130 sp<MetaData> setH264Format(AVCodecContext *avctx)
134 CHECK_EQ(avctx->codec_id, AV_CODEC_ID_H264);
135 CHECK_NE(avctx->extradata[0], 1); //configurationVersion
137 sp<ABuffer> buffer = new ABuffer(avctx->extradata_size);
138 memcpy(buffer->data(), avctx->extradata, avctx->extradata_size);
139 return MakeAVCCodecSpecificData(buffer);
142 sp<MetaData> setMPEG4Format(AVCodecContext *avctx)
146 sp<ABuffer> csd = new ABuffer(avctx->extradata_size);
147 memcpy(csd->data(), avctx->extradata, avctx->extradata_size);
148 sp<ABuffer> esds = MakeMPEGVideoESDS(csd);
150 sp<MetaData> meta = new MetaData;
151 meta->setData(kKeyESDS, kTypeESDS, esds->data(), esds->size());
152 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_MPEG4);
157 sp<MetaData> setH263Format(AVCodecContext *avctx)
161 sp<MetaData> meta = new MetaData;
162 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_H263);
167 sp<MetaData> setMPEG2VIDEOFormat(AVCodecContext *avctx)
169 ALOGV("MPEG%uVIDEO", avctx->codec_id == AV_CODEC_ID_MPEG2VIDEO ? 2 : 1);
171 sp<ABuffer> csd = new ABuffer(avctx->extradata_size);
172 memcpy(csd->data(), avctx->extradata, avctx->extradata_size);
173 sp<ABuffer> esds = MakeMPEGVideoESDS(csd);
175 sp<MetaData> meta = new MetaData;
176 meta->setData(kKeyESDS, kTypeESDS, esds->data(), esds->size());
177 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_MPEG2);
182 sp<MetaData> setVC1Format(AVCodecContext *avctx)
186 sp<MetaData> meta = new MetaData;
187 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_VC1);
188 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
193 sp<MetaData> setWMV1Format(AVCodecContext *avctx)
197 sp<MetaData> meta = new MetaData;
198 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_WMV);
199 meta->setInt32(kKeyWMVVersion, kTypeWMVVer_7);
204 sp<MetaData> setWMV2Format(AVCodecContext *avctx)
208 sp<MetaData> meta = new MetaData;
209 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_WMV);
210 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
211 meta->setInt32(kKeyWMVVersion, kTypeWMVVer_8);
216 sp<MetaData> setWMV3Format(AVCodecContext *avctx)
220 sp<MetaData> meta = new MetaData;
221 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_WMV);
222 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
223 meta->setInt32(kKeyWMVVersion, kTypeWMVVer_9);
228 sp<MetaData> setRV20Format(AVCodecContext *avctx)
232 sp<MetaData> meta = new MetaData;
233 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RV);
234 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
235 meta->setInt32(kKeyRVVersion, kTypeRVVer_G2); //http://en.wikipedia.org/wiki/RealVide
240 sp<MetaData> setRV30Format(AVCodecContext *avctx)
244 sp<MetaData> meta = new MetaData;
245 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RV);
246 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
247 meta->setInt32(kKeyRVVersion, kTypeRVVer_8); //http://en.wikipedia.org/wiki/RealVide
252 sp<MetaData> setRV40Format(AVCodecContext *avctx)
256 sp<MetaData> meta = new MetaData;
257 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RV);
258 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
259 meta->setInt32(kKeyRVVersion, kTypeRVVer_9); //http://en.wikipedia.org/wiki/RealVide
264 sp<MetaData> setFLV1Format(AVCodecContext *avctx)
266 ALOGV("FLV1(Sorenson H263)");
268 sp<MetaData> meta = new MetaData;
269 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_FLV1);
270 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
275 sp<MetaData> setHEVCFormat(AVCodecContext *avctx)
279 sp<MetaData> meta = new MetaData;
280 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_HEVC);
281 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
288 sp<MetaData> setMP2Format(AVCodecContext *avctx)
292 sp<MetaData> meta = new MetaData;
293 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_II);
298 sp<MetaData> setMP3Format(AVCodecContext *avctx)
302 sp<MetaData> meta = new MetaData;
303 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_MPEG);
308 sp<MetaData> setVORBISFormat(AVCodecContext *avctx)
312 uint8_t *header_start[3];
314 if (avpriv_split_xiph_headers(avctx->extradata,
315 avctx->extradata_size, 30,
316 header_start, header_len) < 0) {
317 ALOGE("vorbis extradata corrupt.");
321 sp<MetaData> meta = new MetaData;
322 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_VORBIS);
323 //identification header
324 meta->setData(kKeyVorbisInfo, 0, header_start[0], header_len[0]);
326 meta->setData(kKeyVorbisBooks, 0, header_start[2], header_len[2]);
331 sp<MetaData> setAC3Format(AVCodecContext *avctx)
335 sp<MetaData> meta = new MetaData;
336 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AC3);
341 sp<MetaData> setAACFormat(AVCodecContext *avctx)
346 const uint8_t *header;
347 uint8_t profile, sf_index, channel;
349 header = avctx->extradata;
350 CHECK(header != NULL);
352 // AudioSpecificInfo follows
353 // oooo offf fccc c000
354 // o - audioObjectType
355 // f - samplingFreqIndex
357 profile = ((header[0] & 0xf8) >> 3) - 1;
358 sf_index = (header[0] & 0x07) << 1 | (header[1] & 0x80) >> 7;
359 sr = getAACSampleRate(sf_index);
361 ALOGE("unsupport the aac sample rate");
364 channel = (header[1] >> 3) & 0xf;
365 ALOGV("aac profile: %d, sf_index: %d, channel: %d", profile, sf_index, channel);
367 sp<MetaData> meta = MakeAACCodecSpecificData(profile, sf_index, channel);
368 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AAC);
373 sp<MetaData> setWMAV1Format(AVCodecContext *avctx)
377 sp<MetaData> meta = new MetaData;
378 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_WMA);
379 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
380 meta->setInt32(kKeyWMAVersion, kTypeWMA); //FIXME version?
385 sp<MetaData> setWMAV2Format(AVCodecContext *avctx)
389 sp<MetaData> meta = new MetaData;
390 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_WMA);
391 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
392 meta->setInt32(kKeyWMAVersion, kTypeWMA);
397 sp<MetaData> setWMAProFormat(AVCodecContext *avctx)
401 sp<MetaData> meta = new MetaData;
402 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_WMA);
403 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
404 meta->setInt32(kKeyWMAVersion, kTypeWMAPro);
409 sp<MetaData> setWMALossLessFormat(AVCodecContext *avctx)
411 ALOGV("WMALOSSLESS");
413 sp<MetaData> meta = new MetaData;
414 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_WMA);
415 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
416 meta->setInt32(kKeyWMAVersion, kTypeWMALossLess);
421 sp<MetaData> setRAFormat(AVCodecContext *avctx)
425 sp<MetaData> meta = new MetaData;
426 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_RA);
427 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
432 sp<MetaData> setAPEFormat(AVCodecContext *avctx)
436 sp<MetaData> meta = new MetaData;
437 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_APE);
438 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
443 sp<MetaData> setDTSFormat(AVCodecContext *avctx)
447 sp<MetaData> meta = new MetaData;
448 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_DTS);
449 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
454 sp<MetaData> setFLACFormat(AVCodecContext *avctx)
458 sp<MetaData> meta = new MetaData;
459 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_FLAC);
460 meta->setData(kKeyRawCodecSpecificData, 0, avctx->extradata, avctx->extradata_size);
465 //Convert H.264 NAL format to annex b
466 status_t convertNal2AnnexB(uint8_t *dst, size_t dst_size,
467 uint8_t *src, size_t src_size, size_t nal_len_size)
471 status_t status = OK;
473 CHECK_EQ(dst_size, src_size);
474 CHECK(nal_len_size == 3 || nal_len_size == 4);
476 while (src_size >= nal_len_size) {
478 for( i = 0; i < nal_len_size; i++ ) {
479 nal_len = (nal_len << 8) | src[i];
482 dst[nal_len_size - 1] = 1;
483 if (nal_len > INT_MAX || nal_len > src_size) {
484 status = ERROR_MALFORMED;
489 src_size -= nal_len_size;
491 memcpy(dst, src, nal_len);
501 } // namespace android