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