19aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim/* 29aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim * Copyright (C) 2015 The Android Open Source Project 39aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim * 49aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim * Licensed under the Apache License, Version 2.0 (the "License"); 59aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim * you may not use this file except in compliance with the License. 69aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim * You may obtain a copy of the License at 79aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim * 89aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim * http://www.apache.org/licenses/LICENSE-2.0 99aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim * 109aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim * Unless required by applicable law or agreed to in writing, software 119aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim * distributed under the License is distributed on an "AS IS" BASIS, 129aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim * See the License for the specific language governing permissions and 149aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim * limitations under the License. 159aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim */ 169aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim 179aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim#ifndef HEVC_UTILS_H_ 189aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim 199aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim#define HEVC_UTILS_H_ 209aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim 219aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim#include <stdint.h> 229aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim 239aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim#include <media/stagefright/foundation/ABase.h> 249aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim#include <media/stagefright/foundation/ABuffer.h> 259aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim#include <utils/Errors.h> 269aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim#include <utils/KeyedVector.h> 279aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim#include <utils/StrongPointer.h> 289aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim#include <utils/Vector.h> 299aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim 309aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kimnamespace android { 319aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim 329aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kimenum { 339aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim kHevcNalUnitTypeVps = 32, 349aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim kHevcNalUnitTypeSps = 33, 359aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim kHevcNalUnitTypePps = 34, 369aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim kHevcNalUnitTypePrefixSei = 39, 379aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim kHevcNalUnitTypeSuffixSei = 40, 389aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim}; 399aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim 409aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kimenum { 419aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim // uint8_t 429aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim kGeneralProfileSpace, 439aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim // uint8_t 449aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim kGeneralTierFlag, 459aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim // uint8_t 469aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim kGeneralProfileIdc, 479aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim // uint32_t 489aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim kGeneralProfileCompatibilityFlags, 499aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim // uint64_t 509aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim kGeneralConstraintIndicatorFlags, 519aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim // uint8_t 529aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim kGeneralLevelIdc, 539aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim // uint8_t 549aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim kChromaFormatIdc, 559aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim // uint8_t 569aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim kBitDepthLumaMinus8, 579aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim // uint8_t 589aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim kBitDepthChromaMinus8, 5972061e5ab52d12c17054aeffbb2299a002b6b53aLajos Molnar // uint8_t 6072061e5ab52d12c17054aeffbb2299a002b6b53aLajos Molnar kVideoFullRangeFlag, 6172061e5ab52d12c17054aeffbb2299a002b6b53aLajos Molnar // uint8_t 6272061e5ab52d12c17054aeffbb2299a002b6b53aLajos Molnar kColourPrimaries, 6372061e5ab52d12c17054aeffbb2299a002b6b53aLajos Molnar // uint8_t 6472061e5ab52d12c17054aeffbb2299a002b6b53aLajos Molnar kTransferCharacteristics, 6572061e5ab52d12c17054aeffbb2299a002b6b53aLajos Molnar // uint8_t 6672061e5ab52d12c17054aeffbb2299a002b6b53aLajos Molnar kMatrixCoeffs, 679aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim}; 689aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim 699aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kimclass HevcParameterSets { 709aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kimpublic: 7172061e5ab52d12c17054aeffbb2299a002b6b53aLajos Molnar enum Info : uint32_t { 7272061e5ab52d12c17054aeffbb2299a002b6b53aLajos Molnar kInfoNone = 0, 7372061e5ab52d12c17054aeffbb2299a002b6b53aLajos Molnar kInfoIsHdr = 1 << 0, 7472061e5ab52d12c17054aeffbb2299a002b6b53aLajos Molnar kInfoHasColorDescription = 1 << 1, 7572061e5ab52d12c17054aeffbb2299a002b6b53aLajos Molnar }; 7672061e5ab52d12c17054aeffbb2299a002b6b53aLajos Molnar 779aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim HevcParameterSets(); 789aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim 799aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim status_t addNalUnit(const uint8_t* data, size_t size); 809aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim 819aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim bool findParam8(uint32_t key, uint8_t *param); 829aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim bool findParam16(uint32_t key, uint16_t *param); 839aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim bool findParam32(uint32_t key, uint32_t *param); 849aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim bool findParam64(uint32_t key, uint64_t *param); 859aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim 869aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim inline size_t getNumNalUnits() { return mNalUnits.size(); } 879aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim size_t getNumNalUnitsOfType(uint8_t type); 889aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim uint8_t getType(size_t index); 899aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim size_t getSize(size_t index); 909aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim // Note that this method does not write the start code. 919aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim bool write(size_t index, uint8_t* dest, size_t size); 929aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim status_t makeHvcc(uint8_t *hvcc, size_t *hvccSize, size_t nalSizeLength); 939aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim 9472061e5ab52d12c17054aeffbb2299a002b6b53aLajos Molnar Info getInfo() const { return mInfo; } 9572061e5ab52d12c17054aeffbb2299a002b6b53aLajos Molnar 969aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kimprivate: 979aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim status_t parseVps(const uint8_t* data, size_t size); 989aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim status_t parseSps(const uint8_t* data, size_t size); 999aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim status_t parsePps(const uint8_t* data, size_t size); 1009aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim 1019aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim KeyedVector<uint32_t, uint64_t> mParams; 1029aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim Vector<sp<ABuffer>> mNalUnits; 10372061e5ab52d12c17054aeffbb2299a002b6b53aLajos Molnar Info mInfo; 1049aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim 1059aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim DISALLOW_EVIL_CONSTRUCTORS(HevcParameterSets); 1069aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim}; 1079aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim 1089aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim} // namespace android 1099aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim 1109aa87d4ef502c9700a31fe46dc6e1d6f99cf4e5eWonsik Kim#endif // HEVC_UTILS_H_ 111