Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 // | 4 // |
| 5 // This file contains an implementation of an H264 Annex-B video stream parser. | 5 // This file contains an implementation of an H264 Annex-B video stream parser. |
| 6 | 6 |
| 7 #ifndef MEDIA_FILTERS_H264_PARSER_H_ | 7 #ifndef MEDIA_FILTERS_H264_PARSER_H_ |
| 8 #define MEDIA_FILTERS_H264_PARSER_H_ | 8 #define MEDIA_FILTERS_H264_PARSER_H_ |
| 9 | 9 |
| 10 #include <sys/types.h> | 10 #include <sys/types.h> |
| 11 | 11 |
| 12 #include <map> | 12 #include <map> |
| 13 | 13 |
| 14 #include "base/basictypes.h" | 14 #include "base/basictypes.h" |
| 15 #include "media/base/media_export.h" | 15 #include "media/base/media_export.h" |
| 16 #include "media/base/ranges.h" | |
| 16 #include "media/filters/h264_bit_reader.h" | 17 #include "media/filters/h264_bit_reader.h" |
| 17 | 18 |
| 18 namespace media { | 19 namespace media { |
| 19 | 20 |
| 21 struct SubsampleEntry; | |
| 22 | |
| 20 // For explanations of each struct and its members, see H.264 specification | 23 // For explanations of each struct and its members, see H.264 specification |
| 21 // at http://www.itu.int/rec/T-REC-H.264. | 24 // at http://www.itu.int/rec/T-REC-H.264. |
| 22 struct MEDIA_EXPORT H264NALU { | 25 struct MEDIA_EXPORT H264NALU { |
| 23 H264NALU(); | 26 H264NALU(); |
| 24 | 27 |
| 25 enum Type { | 28 enum Type { |
| 26 kUnspecified = 0, | 29 kUnspecified = 0, |
| 27 kNonIDRSlice = 1, | 30 kNonIDRSlice = 1, |
| 28 kSliceDataA = 2, | 31 kSliceDataA = 2, |
| 29 kSliceDataB = 3, | 32 kSliceDataB = 3, |
| (...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 330 // - |*start_code_size| is either 0, 3 or 4. | 333 // - |*start_code_size| is either 0, 3 or 4. |
| 331 static bool FindStartCode(const uint8* data, off_t data_size, | 334 static bool FindStartCode(const uint8* data, off_t data_size, |
| 332 off_t* offset, off_t* start_code_size); | 335 off_t* offset, off_t* start_code_size); |
| 333 | 336 |
| 334 H264Parser(); | 337 H264Parser(); |
| 335 ~H264Parser(); | 338 ~H264Parser(); |
| 336 | 339 |
| 337 void Reset(); | 340 void Reset(); |
| 338 // Set current stream pointer to |stream| of |stream_size| in bytes, | 341 // Set current stream pointer to |stream| of |stream_size| in bytes, |
| 339 // |stream| owned by caller. | 342 // |stream| owned by caller. |
| 343 // |subsamples| contains information about what parts of |stream| are | |
| 344 // encrypted. | |
| 340 void SetStream(const uint8* stream, off_t stream_size); | 345 void SetStream(const uint8* stream, off_t stream_size); |
| 346 void SetStream(const uint8* stream, off_t stream_size, | |
| 347 const std::vector<SubsampleEntry>& subsamples); | |
|
xhwang
2014/07/10 06:23:01
nit: The style guide doesn't encourage function ov
xhwang
2014/07/10 06:23:01
nit: Add include for vector.
acolwell GONE FROM CHROMIUM
2014/07/15 22:10:44
Done.
acolwell GONE FROM CHROMIUM
2014/07/15 22:10:44
Done.
| |
| 341 | 348 |
| 342 // Read the stream to find the next NALU, identify it and return | 349 // Read the stream to find the next NALU, identify it and return |
| 343 // that information in |*nalu|. This advances the stream to the beginning | 350 // that information in |*nalu|. This advances the stream to the beginning |
| 344 // of this NALU, but not past it, so subsequent calls to NALU-specific | 351 // of this NALU, but not past it, so subsequent calls to NALU-specific |
| 345 // parsing functions (ParseSPS, etc.) will parse this NALU. | 352 // parsing functions (ParseSPS, etc.) will parse this NALU. |
| 346 // If the caller wishes to skip the current NALU, it can call this function | 353 // If the caller wishes to skip the current NALU, it can call this function |
| 347 // again, instead of any NALU-type specific parse functions below. | 354 // again, instead of any NALU-type specific parse functions below. |
| 348 Result AdvanceToNextNALU(H264NALU* nalu); | 355 Result AdvanceToNextNALU(H264NALU* nalu); |
| 349 | 356 |
| 350 // NALU-specific parsing functions. | 357 // NALU-specific parsing functions. |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 385 private: | 392 private: |
| 386 // Move the stream pointer to the beginning of the next NALU, | 393 // Move the stream pointer to the beginning of the next NALU, |
| 387 // i.e. pointing at the next start code. | 394 // i.e. pointing at the next start code. |
| 388 // Return true if a NALU has been found. | 395 // Return true if a NALU has been found. |
| 389 // If a NALU is found: | 396 // If a NALU is found: |
| 390 // - its size in bytes is returned in |*nalu_size| and includes | 397 // - its size in bytes is returned in |*nalu_size| and includes |
| 391 // the start code as well as the trailing zero bits. | 398 // the start code as well as the trailing zero bits. |
| 392 // - the size in bytes of the start code is returned in |*start_code_size|. | 399 // - the size in bytes of the start code is returned in |*start_code_size|. |
| 393 bool LocateNALU(off_t* nalu_size, off_t* start_code_size); | 400 bool LocateNALU(off_t* nalu_size, off_t* start_code_size); |
| 394 | 401 |
| 402 // Wrapper for FindStartCode() that skips over start codes that | |
| 403 // may appear inside |encrypted_ranges_|. | |
| 404 bool FindNextStartCode(const uint8* data, off_t data_size, | |
|
xhwang
2014/07/10 06:23:01
It's not obvious to know the difference b/w FindSt
acolwell GONE FROM CHROMIUM
2014/07/15 22:10:44
Done.
| |
| 405 off_t* offset, off_t* start_code_size); | |
| 406 | |
| 395 // Exp-Golomb code parsing as specified in chapter 9.1 of the spec. | 407 // Exp-Golomb code parsing as specified in chapter 9.1 of the spec. |
| 396 // Read one unsigned exp-Golomb code from the stream and return in |*val|. | 408 // Read one unsigned exp-Golomb code from the stream and return in |*val|. |
| 397 Result ReadUE(int* val); | 409 Result ReadUE(int* val); |
| 398 | 410 |
| 399 // Read one signed exp-Golomb code from the stream and return in |*val|. | 411 // Read one signed exp-Golomb code from the stream and return in |*val|. |
| 400 Result ReadSE(int* val); | 412 Result ReadSE(int* val); |
| 401 | 413 |
| 402 // Parse scaling lists (see spec). | 414 // Parse scaling lists (see spec). |
| 403 Result ParseScalingList(int size, int* scaling_list, bool* use_default); | 415 Result ParseScalingList(int size, int* scaling_list, bool* use_default); |
| 404 Result ParseSPSScalingLists(H264SPS* sps); | 416 Result ParseSPSScalingLists(H264SPS* sps); |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 434 off_t bytes_left_; | 446 off_t bytes_left_; |
| 435 | 447 |
| 436 H264BitReader br_; | 448 H264BitReader br_; |
| 437 | 449 |
| 438 // PPSes and SPSes stored for future reference. | 450 // PPSes and SPSes stored for future reference. |
| 439 typedef std::map<int, H264SPS*> SPSById; | 451 typedef std::map<int, H264SPS*> SPSById; |
| 440 typedef std::map<int, H264PPS*> PPSById; | 452 typedef std::map<int, H264PPS*> PPSById; |
| 441 SPSById active_SPSes_; | 453 SPSById active_SPSes_; |
| 442 PPSById active_PPSes_; | 454 PPSById active_PPSes_; |
| 443 | 455 |
| 456 Ranges<const uint8*> encrypted_ranges_; | |
|
xhwang
2014/07/10 06:23:01
Since this range is only used for searching for st
acolwell GONE FROM CHROMIUM
2014/07/15 22:10:44
Done.
| |
| 457 | |
| 444 DISALLOW_COPY_AND_ASSIGN(H264Parser); | 458 DISALLOW_COPY_AND_ASSIGN(H264Parser); |
| 445 }; | 459 }; |
| 446 | 460 |
| 447 } // namespace media | 461 } // namespace media |
| 448 | 462 |
| 449 #endif // MEDIA_FILTERS_H264_PARSER_H_ | 463 #endif // MEDIA_FILTERS_H264_PARSER_H_ |
| OLD | NEW |