summaryrefslogtreecommitdiff
path: root/ext/mplex/videostrm.hh
blob: 6eeac47610fb17c11c9ff1549bed5ecc54e85e17 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155

/*
 *  videostrm.hh:  Video stream elementary input stream
 *
 *  Copyright (C) 2001 Andrew Stevens <andrew.stevens@philips.com>
 *
 *
 *  This program is free software; you can redistribute it and/or
 *  modify it under the terms of version 2 of the GNU General Public License
 *  as published by the Free Software Foundation.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */

#ifndef __VIDEOSTRM_H__
#define __VIDEOSTRM_H__

#include "inputstrm.hh"

class VideoStream:public ElementaryStream
{
public:
  VideoStream (IBitStream & ibs, OutputStream & into);
  void Init (const int stream_num);
  static bool Probe (IBitStream & bs);

  void Close ();

  inline int AUType ()
  {
    return au->type;
  }

  inline bool EndSeq ()
  {
    return au->end_seq;
  }

  inline int NextAUType ()
  {
    VAunit *p_au = Lookahead ();

    if (p_au != NULL)
      return p_au->type;
    else
      return NOFRAME;
  }

  inline bool SeqHdrNext ()
  {
    VAunit *p_au = Lookahead ();

    return p_au != NULL && p_au->seq_header;
  }

  virtual unsigned int NominalBitRate ()
  {
    return bit_rate * 50;
  }

  virtual void OutputGOPControlSector ();
  bool RunOutComplete ();
  virtual bool MuxPossible (clockticks currentSCR);
  void SetMaxStdBufferDelay (unsigned int demux_rate);
  void OutputSector ();

protected:
  void OutputSeqhdrInfo ();
  virtual bool AUBufferNeedsRefill ();
  virtual void FillAUbuffer (unsigned int frames_to_buffer);
  virtual void InitAUbuffer ();
  virtual void NextDTSPTS (clockticks & DTS, clockticks & PTS);
  void ScanFirstSeqHeader ();
  uint8_t NewAUTimestamps (int AUtype);
  bool NewAUBuffers (int AUtype);

public:
  unsigned int num_sequence;
  unsigned int num_seq_end;
  unsigned int num_pictures;
  unsigned int num_groups;
  unsigned int num_frames[4];
  unsigned int avg_frames[4];

  unsigned int horizontal_size;
  unsigned int vertical_size;
  unsigned int aspect_ratio;
  unsigned int picture_rate;
  unsigned int bit_rate;
  unsigned int comp_bit_rate;
  unsigned int peak_bit_rate;
  unsigned int vbv_buffer_size;
  unsigned int CSPF;
  double secs_per_frame;


  bool dtspts_for_all_au;
  bool gop_control_packet;

protected:

  /* State variables for scanning source bit-stream */
  VAunit access_unit;
  unsigned int fields_presented;
  unsigned int group_order;
  unsigned int group_start_pic;
  unsigned int group_start_field;
  int temporal_reference;
  unsigned int pict_rate;
  unsigned int pict_struct;
  int pulldown_32;
  int repeat_first_field;
  int prev_temp_ref;
  double frame_rate;
  unsigned int max_bits_persec;
  int AU_pict_data;
  int AU_hdr;
  clockticks max_PTS;
  clockticks max_STD_buffer_delay;

  int opt_mpeg;
  int opt_multifile_segment;
};

//
// DVD's generate control sectors for each GOP...
//

class DVDVideoStream:public VideoStream
{
public:
  DVDVideoStream (IBitStream & ibs, OutputStream & into):VideoStream (ibs, into)
  {
    gop_control_packet = true;
  }
  void OutputGOPControlSector ();
};

#endif // __INPUTSTRM_H__


/* 
 * Local variables:
 *  c-file-style: "stroustrup"
 *  tab-width: 4
 *  indent-tabs-mode: nil
 * End:
 */