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_ |