| Index: media/filters/h265_parser.h
|
| diff --git a/media/filters/h265_parser.h b/media/filters/h265_parser.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f3cf71335224baa321bb7a8b0d60f67c421c5c6c
|
| --- /dev/null
|
| +++ b/media/filters/h265_parser.h
|
| @@ -0,0 +1,151 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +//
|
| +// This file contains an implementation of an H265 Annex-B video stream parser.
|
| +
|
| +#ifndef MEDIA_FILTERS_H265_PARSER_H_
|
| +#define MEDIA_FILTERS_H265_PARSER_H_
|
| +
|
| +#include <sys/types.h>
|
| +
|
| +#include <map>
|
| +#include <vector>
|
| +
|
| +#include "base/basictypes.h"
|
| +#include "base/macros.h"
|
| +#include "media/base/media_export.h"
|
| +#include "media/base/ranges.h"
|
| +#include "media/filters/h264_bit_reader.h"
|
| +#include "media/filters/h264_parser.h"
|
| +
|
| +namespace media {
|
| +
|
| +struct SubsampleEntry;
|
| +
|
| +// For explanations of each struct and its members, see H.265 specification
|
| +// at http://www.itu.int/rec/T-REC-H.265.
|
| +struct MEDIA_EXPORT H265NALU {
|
| + H265NALU();
|
| +
|
| + // NAL Unit types are taken from Table 7-1 of HEVC/H265 standard
|
| + // http://www.itu.int/rec/T-REC-H.265-201410-I/en
|
| + enum Type {
|
| + TRAIL_N = 0,
|
| + TRAIL_R = 1,
|
| + TSA_N = 2,
|
| + TSA_R = 3,
|
| + STSA_N = 4,
|
| + STSA_R = 5,
|
| + RADL_N = 6,
|
| + RADL_R = 7,
|
| + RASL_N = 8,
|
| + RASL_R = 9,
|
| + RSV_VCL_N10 = 10,
|
| + RSV_VCL_R11 = 11,
|
| + RSV_VCL_N12 = 12,
|
| + RSV_VCL_R13 = 13,
|
| + RSV_VCL_N14 = 14,
|
| + RSV_VCL_R15 = 15,
|
| + BLA_W_LP = 16,
|
| + BLA_W_RADL = 17,
|
| + BLA_N_LP = 18,
|
| + IDR_W_RADL = 19,
|
| + IDR_N_LP = 20,
|
| + CRA_NUT = 21,
|
| + RSV_IRAP_VCL22 = 22,
|
| + RSV_IRAP_VCL23 = 23,
|
| + RSV_VCL24 = 24,
|
| + RSV_VCL25 = 25,
|
| + RSV_VCL26 = 26,
|
| + RSV_VCL27 = 27,
|
| + RSV_VCL28 = 28,
|
| + RSV_VCL29 = 29,
|
| + RSV_VCL30 = 30,
|
| + RSV_VCL31 = 31,
|
| + VPS_NUT = 32,
|
| + SPS_NUT = 33,
|
| + PPS_NUT = 34,
|
| + AUD_NUT = 35,
|
| + EOS_NUT = 36,
|
| + EOB_NUT = 37,
|
| + FD_NUT = 38,
|
| + PREFIX_SEI_NUT = 39,
|
| + SUFFIX_SEI_NUT = 40,
|
| + RSV_NVCL41 = 41,
|
| + RSV_NVCL42 = 42,
|
| + RSV_NVCL43 = 43,
|
| + RSV_NVCL44 = 44,
|
| + RSV_NVCL45 = 45,
|
| + RSV_NVCL46 = 46,
|
| + RSV_NVCL47 = 47,
|
| + };
|
| +
|
| + // After (without) start code; we don't own the underlying memory
|
| + // and a shallow copy should be made when copying this struct.
|
| + const uint8* data;
|
| + off_t size; // From after start code to start code of next NALU (or EOS).
|
| +
|
| + int nal_unit_type;
|
| + int nuh_layer_id;
|
| + int nuh_temporal_id_plus1;
|
| +};
|
| +
|
| +// Class to parse an Annex-B H.265 stream.
|
| +class MEDIA_EXPORT H265Parser {
|
| + public:
|
| + enum Result {
|
| + kOk,
|
| + kInvalidStream, // error in stream
|
| + kUnsupportedStream, // stream not supported by the parser
|
| + kEOStream, // end of stream
|
| + };
|
| +
|
| + H265Parser();
|
| + ~H265Parser();
|
| +
|
| + void Reset();
|
| + // Set current stream pointer to |stream| of |stream_size| in bytes,
|
| + // |stream| owned by caller.
|
| + // |subsamples| contains information about what parts of |stream| are
|
| + // encrypted.
|
| + void SetStream(const uint8* stream, off_t stream_size);
|
| + void SetEncryptedStream(const uint8* stream, off_t stream_size,
|
| + const std::vector<SubsampleEntry>& subsamples);
|
| +
|
| + // Read the stream to find the next NALU, identify it and return
|
| + // that information in |*nalu|. This advances the stream to the beginning
|
| + // of this NALU, but not past it, so subsequent calls to NALU-specific
|
| + // parsing functions (ParseSPS, etc.) will parse this NALU.
|
| + // If the caller wishes to skip the current NALU, it can call this function
|
| + // again, instead of any NALU-type specific parse functions below.
|
| + Result AdvanceToNextNALU(H265NALU* nalu);
|
| +
|
| + private:
|
| + // Move the stream pointer to the beginning of the next NALU,
|
| + // i.e. pointing at the next start code.
|
| + // Return true if a NALU has been found.
|
| + // If a NALU is found:
|
| + // - its size in bytes is returned in |*nalu_size| and includes
|
| + // the start code as well as the trailing zero bits.
|
| + // - the size in bytes of the start code is returned in |*start_code_size|.
|
| + bool LocateNALU(off_t* nalu_size, off_t* start_code_size);
|
| +
|
| + // Pointer to the current NALU in the stream.
|
| + const uint8* stream_;
|
| +
|
| + // Bytes left in the stream after the current NALU.
|
| + off_t bytes_left_;
|
| +
|
| + H264BitReader br_;
|
| +
|
| + // Ranges of encrypted bytes in the buffer passed to
|
| + // SetEncryptedStream().
|
| + Ranges<const uint8*> encrypted_ranges_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(H265Parser);
|
| +};
|
| +
|
| +} // namespace media
|
| +
|
| +#endif // MEDIA_FILTERS_H265_PARSER_H_
|
|
|