1cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber/* 2cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * Copyright (C) 2010 The Android Open Source Project 3cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * 4cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * you may not use this file except in compliance with the License. 6cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * You may obtain a copy of the License at 7cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * 8cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * 10cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * Unless required by applicable law or agreed to in writing, software 11cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * See the License for the specific language governing permissions and 14cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * limitations under the License. 15cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber */ 16cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1785f12e9b9062402d6110df3f7099707912040edbAndreas Huber#ifndef AVC_UTILS_H_ 18cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1985f12e9b9062402d6110df3f7099707912040edbAndreas Huber#define AVC_UTILS_H_ 20cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 217e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kim#include <media/MediaCodecBuffer.h> 2285f12e9b9062402d6110df3f7099707912040edbAndreas Huber#include <media/stagefright/foundation/ABuffer.h> 2395d7e994c73c17b27c7134ba3cc3acbb5889aa87Mathias Agopian#include <utils/Errors.h> 24cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 25cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubernamespace android { 26cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 2786a58cabe322b746ab0eb17f0cade34ed68ba60eBernhard Rosenkränzerclass ABitReader; 286a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber 29bfd41f33c77c66ead48ee378e4ea4b7bfa5fca1fAndreas Huberenum { 30bfd41f33c77c66ead48ee378e4ea4b7bfa5fca1fAndreas Huber kAVCProfileBaseline = 0x42, 31bfd41f33c77c66ead48ee378e4ea4b7bfa5fca1fAndreas Huber kAVCProfileMain = 0x4d, 32bfd41f33c77c66ead48ee378e4ea4b7bfa5fca1fAndreas Huber kAVCProfileExtended = 0x58, 33bfd41f33c77c66ead48ee378e4ea4b7bfa5fca1fAndreas Huber kAVCProfileHigh = 0x64, 34bfd41f33c77c66ead48ee378e4ea4b7bfa5fca1fAndreas Huber kAVCProfileHigh10 = 0x6e, 35bfd41f33c77c66ead48ee378e4ea4b7bfa5fca1fAndreas Huber kAVCProfileHigh422 = 0x7a, 36bfd41f33c77c66ead48ee378e4ea4b7bfa5fca1fAndreas Huber kAVCProfileHigh444 = 0xf4, 37bfd41f33c77c66ead48ee378e4ea4b7bfa5fca1fAndreas Huber kAVCProfileCAVLC444Intra = 0x2c 38bfd41f33c77c66ead48ee378e4ea4b7bfa5fca1fAndreas Huber}; 39bfd41f33c77c66ead48ee378e4ea4b7bfa5fca1fAndreas Huber 4078acc89eae9789366b6384707861f4563addf2d3Chong Zhangstruct NALPosition { 410b8dec713aee5b6fde8c4aedee91674795004725Marco Nelissen uint32_t nalOffset; 420b8dec713aee5b6fde8c4aedee91674795004725Marco Nelissen uint32_t nalSize; 4378acc89eae9789366b6384707861f4563addf2d3Chong Zhang}; 4478acc89eae9789366b6384707861f4563addf2d3Chong Zhang 45e9810fae2ca6620337b75a787786cc0ea52adecdAndreas Huber// Optionally returns sample aspect ratio as well. 4685f12e9b9062402d6110df3f7099707912040edbAndreas Hubervoid FindAVCDimensions( 47e9810fae2ca6620337b75a787786cc0ea52adecdAndreas Huber const sp<ABuffer> &seqParamSet, 48e9810fae2ca6620337b75a787786cc0ea52adecdAndreas Huber int32_t *width, int32_t *height, 49e9810fae2ca6620337b75a787786cc0ea52adecdAndreas Huber int32_t *sarWidth = NULL, int32_t *sarHeight = NULL); 50cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 512f4555e2080b7bd9933924840e70a1d4fc87ecb2Lajos Molnar// Gets and returns an unsigned exp-golomb (ue) value from a bit reader |br|. Aborts if the value 522f4555e2080b7bd9933924840e70a1d4fc87ecb2Lajos Molnar// is more than 64 bits long (>=0xFFFF (!)) or the bit reader overflows. 536a63a939601645404fd98f58c19cc38ca818d99eAndreas Huberunsigned parseUE(ABitReader *br); 546a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber 552f4555e2080b7bd9933924840e70a1d4fc87ecb2Lajos Molnar// Gets and returns a signed exp-golomb (se) value from a bit reader |br|. Aborts if the value is 562f4555e2080b7bd9933924840e70a1d4fc87ecb2Lajos Molnar// more than 64 bits long (>0x7FFF || <-0x7FFF (!)) or the bit reader overflows. 572f4555e2080b7bd9933924840e70a1d4fc87ecb2Lajos Molnarsigned parseSE(ABitReader *br); 582f4555e2080b7bd9933924840e70a1d4fc87ecb2Lajos Molnar 592f4555e2080b7bd9933924840e70a1d4fc87ecb2Lajos Molnar// Gets an unsigned exp-golomb (ue) value from a bit reader |br|, and returns it if it was 602f4555e2080b7bd9933924840e70a1d4fc87ecb2Lajos Molnar// successful. Returns |fallback| if it was unsuccessful. Note: if the value was longer that 64 612f4555e2080b7bd9933924840e70a1d4fc87ecb2Lajos Molnar// bits, it reads past the value and still returns |fallback|. 622f4555e2080b7bd9933924840e70a1d4fc87ecb2Lajos Molnarunsigned parseUEWithFallback(ABitReader *br, unsigned fallback); 632f4555e2080b7bd9933924840e70a1d4fc87ecb2Lajos Molnar 642f4555e2080b7bd9933924840e70a1d4fc87ecb2Lajos Molnar// Gets a signed exp-golomb (se) value from a bit reader |br|, and returns it if it was successful. 652f4555e2080b7bd9933924840e70a1d4fc87ecb2Lajos Molnar// Returns |fallback| if it was unsuccessful. Note: if the value was longer that 64 bits, it reads 662f4555e2080b7bd9933924840e70a1d4fc87ecb2Lajos Molnar// past the value and still returns |fallback|. 672f4555e2080b7bd9933924840e70a1d4fc87ecb2Lajos Molnarsigned parseSEWithFallback(ABitReader *br, signed fallback); 682f4555e2080b7bd9933924840e70a1d4fc87ecb2Lajos Molnar 692f4555e2080b7bd9933924840e70a1d4fc87ecb2Lajos Molnar// Skips an unsigned exp-golomb (ue) value from bit reader |br|. 702f4555e2080b7bd9933924840e70a1d4fc87ecb2Lajos Molnarinline void skipUE(ABitReader *br) { 712f4555e2080b7bd9933924840e70a1d4fc87ecb2Lajos Molnar (void)parseUEWithFallback(br, 0U); 722f4555e2080b7bd9933924840e70a1d4fc87ecb2Lajos Molnar} 732f4555e2080b7bd9933924840e70a1d4fc87ecb2Lajos Molnar 742f4555e2080b7bd9933924840e70a1d4fc87ecb2Lajos Molnar// Skips a signed exp-golomb (se) value from bit reader |br|. 752f4555e2080b7bd9933924840e70a1d4fc87ecb2Lajos Molnarinline void skipSE(ABitReader *br) { 762f4555e2080b7bd9933924840e70a1d4fc87ecb2Lajos Molnar (void)parseSEWithFallback(br, 0); 772f4555e2080b7bd9933924840e70a1d4fc87ecb2Lajos Molnar} 782f4555e2080b7bd9933924840e70a1d4fc87ecb2Lajos Molnar 79c68a48c474f609df3eeb7d9738675d6ac8835e0aAndreas Huberstatus_t getNextNALUnit( 80c68a48c474f609df3eeb7d9738675d6ac8835e0aAndreas Huber const uint8_t **_data, size_t *_size, 81c68a48c474f609df3eeb7d9738675d6ac8835e0aAndreas Huber const uint8_t **nalStart, size_t *nalSize, 82c68a48c474f609df3eeb7d9738675d6ac8835e0aAndreas Huber bool startCodeFollows = false); 83c68a48c474f609df3eeb7d9738675d6ac8835e0aAndreas Huber 8486a58cabe322b746ab0eb17f0cade34ed68ba60eBernhard Rosenkränzerclass MetaData; 85c68a48c474f609df3eeb7d9738675d6ac8835e0aAndreas Hubersp<MetaData> MakeAVCCodecSpecificData(const sp<ABuffer> &accessUnit); 86c68a48c474f609df3eeb7d9738675d6ac8835e0aAndreas Huber 87c68a48c474f609df3eeb7d9738675d6ac8835e0aAndreas Huberbool IsIDR(const sp<ABuffer> &accessUnit); 887e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kimbool IsIDR(const sp<MediaCodecBuffer> &accessUnit); 893fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huberbool IsAVCReferenceFrame(const sp<ABuffer> &accessUnit); 904dbff11975e737482537e1636051690188f3fbc4Praveen Chavanuint32_t FindAVCLayerId(const uint8_t *data, size_t size); 91c68a48c474f609df3eeb7d9738675d6ac8835e0aAndreas Huber 92bfd41f33c77c66ead48ee378e4ea4b7bfa5fca1fAndreas Huberconst char *AVCProfileToString(uint8_t profile); 93bfd41f33c77c66ead48ee378e4ea4b7bfa5fca1fAndreas Huber 9450c44c79d2d7dd6cd1485d9d939f67f80b8da1caGloria Wangsp<MetaData> MakeAACCodecSpecificData( 9550c44c79d2d7dd6cd1485d9d939f67f80b8da1caGloria Wang unsigned profile, unsigned sampling_freq_index, 9650c44c79d2d7dd6cd1485d9d939f67f80b8da1caGloria Wang unsigned channel_configuration); 9750c44c79d2d7dd6cd1485d9d939f67f80b8da1caGloria Wang 98386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber// Given an MPEG4 video VOL-header chunk (starting with 0x00 0x00 0x01 0x2?) 99386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber// parse it and fill in dimensions, returns true iff successful. 100386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huberbool ExtractDimensionsFromVOLHeader( 101386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber const uint8_t *data, size_t size, int32_t *width, int32_t *height); 102386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 103386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huberbool GetMPEGAudioFrameSize( 104386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber uint32_t header, size_t *frame_size, 105386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber int *out_sampling_rate = NULL, int *out_channels = NULL, 106386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber int *out_bitrate = NULL, int *out_num_samples = NULL); 107386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 108cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} // namespace android 109cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 11085f12e9b9062402d6110df3f7099707912040edbAndreas Huber#endif // AVC_UTILS_H_ 111