Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(172)

Side by Side Diff: media/mp2t/es_parser_h264.h

Issue 23566013: Mpeg2 TS stream parser for media source. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Clang warning fix Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « media/mp2t/es_parser_adts.cc ('k') | media/mp2t/es_parser_h264.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef MEDIA_MP2T_ES_PARSER_H264_H_
6 #define MEDIA_MP2T_ES_PARSER_H264_H_
7
8 #include <list>
9 #include <utility>
10
11 #include "base/basictypes.h"
12 #include "base/callback.h"
13 #include "base/compiler_specific.h"
14 #include "base/time/time.h"
15 #include "media/base/byte_queue.h"
16 #include "media/base/video_decoder_config.h"
17 #include "media/mp2t/es_parser.h"
18
19 namespace media {
20 class BitReader;
21 class StreamParserBuffer;
22 }
23
24 namespace media {
25 namespace mp2t {
26
27 // Remark:
28 // In this h264 parser, frame splitting is based on AUD nals.
29 // Mpeg2 TS spec: "2.14 Carriage of Rec. ITU-T H.264 | ISO/IEC 14496-10 video"
30 // "Each AVC access unit shall contain an access unit delimiter NAL Unit;"
31 //
32 class EsParserH264 : public EsParser {
33 public:
34 typedef base::Callback<void(const VideoDecoderConfig&)> NewVideoConfigCB;
35
36 EsParserH264(const NewVideoConfigCB& new_video_config_cb,
37 const EmitBufferCB& emit_buffer_cb);
38 virtual ~EsParserH264();
39
40 // EsParser implementation.
41 virtual bool Parse(const uint8* buf, int size,
42 base::TimeDelta pts,
43 base::TimeDelta dts) OVERRIDE;
44 virtual void Flush() OVERRIDE;
45 virtual void Reset() OVERRIDE;
46
47 private:
48 struct TimingDesc {
49 base::TimeDelta dts;
50 base::TimeDelta pts;
51 };
52
53 // H264 parser.
54 // It resumes parsing from byte position |es_pos_|.
55 bool ParseInternal();
56
57 // Emit a frame if a frame has been started earlier.
58 void EmitFrameIfNeeded(int next_aud_pos);
59
60 // Start a new frame.
61 // Note: if aud_pos < 0, clear the current frame.
62 void StartFrame(int aud_pos);
63
64 // Discard |nbytes| of ES from the ES byte queue.
65 void DiscardEs(int nbytes);
66
67 // Parse a NAL / SPS.
68 // Returns true if successful (compliant bitstream).
69 bool NalParser(const uint8* buf, int size);
70 bool ProcessSPS(const uint8* buf, int size);
71
72 // Callbacks to pass the stream configuration and the frames.
73 NewVideoConfigCB new_video_config_cb_;
74 EmitBufferCB emit_buffer_cb_;
75
76 // Bytes of the ES stream that have not been emitted yet.
77 ByteQueue es_byte_queue_;
78 std::list<std::pair<int, TimingDesc> > timing_desc_list_;
79
80 // H264 parser state.
81 // Note: |current_access_unit_pos_| is pointing to an annexB syncword
82 // while |current_nal_pos_| is pointing to the NAL unit
83 // (i.e. does not include the annexB syncword).
84 int es_pos_;
85 int current_nal_pos_;
86 int current_access_unit_pos_;
87 bool is_key_frame_;
88
89 // Last video decoder config.
90 VideoDecoderConfig last_video_decoder_config_;
91 };
92
93 } // namespace mp2t
94 } // namespace media
95
96 #endif
97
OLDNEW
« no previous file with comments | « media/mp2t/es_parser_adts.cc ('k') | media/mp2t/es_parser_h264.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698