live
H263plusVideoStreamParser.hh
Go to the documentation of this file.
1/**********
2This library is free software; you can redistribute it and/or modify it under
3the terms of the GNU Lesser General Public License as published by the
4Free Software Foundation; either version 3 of the License, or (at your
5option) any later version. (See <http://www.gnu.org/copyleft/lesser.html>.)
6
7This library is distributed in the hope that it will be useful, but WITHOUT
8ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
9FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
10more details.
11
12You should have received a copy of the GNU Lesser General Public License
13along with this library; if not, write to the Free Software Foundation, Inc.,
1451 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
15**********/
16// "liveMedia"
17// Copyright (c) 1996-2024 Live Networks, Inc. All rights reserved.
18// A filter that breaks up an H263 video stream into frames.
19// derived from MPEG4IP h263.c
20// Author Benhard Feiten
21
22#ifndef _H263PLUS_VIDEO_STREAM_PARSER_HH
23#define _H263PLUS_VIDEO_STREAM_PARSER_HH
24
25#ifndef _STREAM_PARSER_HH
26#include "StreamParser.hh"
27#endif
28
29
30// Default timescale for H.263 (1000ms)
31#define H263_TIMESCALE 1000
32
33// Default H263 frame rate (30fps)
34#define H263_BASIC_FRAME_RATE 30
35
36// Minimum number of bytes needed to parse an H263 header
37#define H263_REQUIRE_HEADER_SIZE_BYTES 5
38
39// Number of bytes the start code requries
40#define H263_STARTCODE_SIZE_BYTES 3
41
42// This is the input buffer's size. It should contain
43// 1 frame with the following start code
44#define H263_BUFFER_SIZE 256 * 1024
45
46// additionalBytesNeeded - indicates how many additional bytes are to be read
47// from the next frame's header (over the 3 bytes that are already read).
48#define ADDITIONAL_BYTES_NEEDED H263_REQUIRE_HEADER_SIZE_BYTES - H263_STARTCODE_SIZE_BYTES
49
50// The default max different (in %) betwqeen max and average bitrates
51#define H263_DEFAULT_CBR_TOLERANCE 10
52
53
54
55// The following structure holds information extracted from each frame's header:
56typedef struct _H263INFO {
57 u_int8_t tr; // Temporal Reference, used in duration calculation
58 u_int16_t width; // Width of the picture
59 u_int16_t height; // Height of the picture
60 bool isSyncFrame; // Frame type (true = I frame = "sync" frame)
62
63typedef struct _MaxBitrate_CTX {
64 u_int32_t bitrateTable[H263_BASIC_FRAME_RATE];// Window of 1 second
65 u_int32_t windowBitrate; // The bitrate of the current window
66 u_int32_t maxBitrate; // The up-to-date maximum bitrate
67 u_int32_t tableIndex; // The next TR unit to update
69
70
72
73public:
75 FramedSource* inputSource);
76
78
79 void registerReadInterest(unsigned char* to, unsigned maxSize);
80
81 unsigned parse(u_int64_t & currentDuration); // returns the size of the frame that was acquired, or 0 if none
82 unsigned numTruncatedBytes() const { return fNumTruncatedBytes; } // The number of truncated bytes (if any)
83
84
85protected:
86// H263plusVideoStreamFramer* usingSource() {
87// return (H263plusVideoStreamFramer*)fUsingSource;
88// }
90
91// void setParseState(H263plusParseState parseState);
92
93
94private:
96 bool ParseShortHeader(u_int8_t *headerBuffer, H263INFO *outputInfoStruct);
97 void GetMaxBitrate( MaxBitrate_CTX *ctx, u_int32_t frameSize, u_int8_t frameTRDiff);
98 u_int64_t CalculateDuration(u_int8_t trDiff);
99 bool GetWidthAndHeight( u_int8_t fmt, u_int16_t *width, u_int16_t *height);
100 u_int8_t GetTRDifference( u_int8_t nextTR, u_int8_t currentTR);
101
103
104protected:
106
107 unsigned char* fTo;
108 unsigned fMaxSize;
109 unsigned char* fStartOfFrame;
110 unsigned char* fSavedTo;
111 unsigned char* fLimit;
114
115private:
116 H263INFO fNextInfo; // Holds information about the next frame
117 H263INFO fCurrentInfo; // Holds information about the current frame
118 MaxBitrate_CTX fMaxBitrateCtx; // Context for the GetMaxBitrate function
119 char fStates[3][256];
121
122 u_int32_t fnextTR; // The next frame's presentation time in TR units
123 u_int64_t fcurrentPT; // The current frame's presentation time in milli-seconds
124
125};
126
127#endif
#define H263_BASIC_FRAME_RATE
struct _MaxBitrate_CTX MaxBitrate_CTX
#define H263_REQUIRE_HEADER_SIZE_BYTES
struct _H263INFO H263INFO
H263plusVideoStreamParser(class H263plusVideoStreamFramer *usingSource, FramedSource *inputSource)
virtual ~H263plusVideoStreamParser()
unsigned parse(u_int64_t &currentDuration)
virtual void restoreSavedParserState()
void registerReadInterest(unsigned char *to, unsigned maxSize)
u_int8_t GetTRDifference(u_int8_t nextTR, u_int8_t currentTR)
void GetMaxBitrate(MaxBitrate_CTX *ctx, u_int32_t frameSize, u_int8_t frameTRDiff)
u_int8_t fNextHeader[H263_REQUIRE_HEADER_SIZE_BYTES]
bool GetWidthAndHeight(u_int8_t fmt, u_int16_t *width, u_int16_t *height)
class H263plusVideoStreamFramer * fUsingSource
bool ParseShortHeader(u_int8_t *headerBuffer, H263INFO *outputInfoStruct)
u_int64_t CalculateDuration(u_int8_t trDiff)
u_int32_t bitrateTable[H263_BASIC_FRAME_RATE]