183 lines
6.3 KiB
C
183 lines
6.3 KiB
C
|
/*
|
||
|
* Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
|
||
|
*
|
||
|
* Use of this source code is governed by a BSD-style license
|
||
|
* that can be found in the LICENSE file in the root of the source
|
||
|
* tree. An additional intellectual property rights grant can be found
|
||
|
* in the file PATENTS. All contributing project authors may
|
||
|
* be found in the AUTHORS file in the root of the source tree.
|
||
|
*/
|
||
|
|
||
|
#ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_H263_INFORMATION_H_
|
||
|
#define WEBRTC_MODULES_RTP_RTCP_SOURCE_H263_INFORMATION_H_
|
||
|
|
||
|
#include "typedefs.h"
|
||
|
|
||
|
#include "video_codec_information.h"
|
||
|
|
||
|
#define MAX_NUMBER_OF_H263_GOB 32 // 5 bits
|
||
|
|
||
|
namespace webrtc {
|
||
|
class H263Info
|
||
|
{
|
||
|
public:
|
||
|
H263Info()
|
||
|
:
|
||
|
uiH263PTypeFmt(0),
|
||
|
codecBits(0),
|
||
|
pQuant(0),
|
||
|
numOfGOBs(0),
|
||
|
totalNumOfMBs(0),
|
||
|
cpmBit(0),
|
||
|
fType(0)
|
||
|
{
|
||
|
memset(ptrGOBbuffer, 0, sizeof(ptrGOBbuffer));
|
||
|
memset(ptrGOBbufferSBit, 0, sizeof(ptrGOBbufferSBit));
|
||
|
memset(ptrGQuant, 0, sizeof(ptrGQuant));
|
||
|
memset(ptrNumOfMBs, 0, sizeof(ptrNumOfMBs));
|
||
|
memset(ptrGroupNum, 0, sizeof(ptrGroupNum));
|
||
|
}
|
||
|
|
||
|
WebRtc_Word32 CalculateMBOffset(const WebRtc_UWord8 numOfGOB) const;
|
||
|
|
||
|
WebRtc_UWord8 uiH263PTypeFmt; // Defines frame size
|
||
|
WebRtc_UWord8 codecBits;
|
||
|
WebRtc_UWord8 pQuant;
|
||
|
WebRtc_UWord8 numOfGOBs; // Total number of GOBs of current frame
|
||
|
|
||
|
WebRtc_UWord16 totalNumOfMBs;
|
||
|
WebRtc_UWord8 cpmBit;
|
||
|
WebRtc_UWord8 fType; // 0 - intra frame, 1 - inter frame
|
||
|
|
||
|
WebRtc_UWord16 ptrNumOfMBs[MAX_NUMBER_OF_H263_GOB]; // Total number of MBs of current GOB
|
||
|
WebRtc_UWord32 ptrGOBbuffer[MAX_NUMBER_OF_H263_GOB]; // GOB buffer (start byte of GOBs)
|
||
|
WebRtc_UWord8 ptrGroupNum[MAX_NUMBER_OF_H263_GOB];
|
||
|
WebRtc_UWord8 ptrGOBbufferSBit[MAX_NUMBER_OF_H263_GOB]; // sBit buffer (number of start bits to ignore for corresponding GOB)
|
||
|
WebRtc_UWord8 ptrGQuant[MAX_NUMBER_OF_H263_GOB]; // quantizer information for GOBs
|
||
|
};
|
||
|
|
||
|
struct H263MBInfo
|
||
|
{
|
||
|
H263MBInfo()
|
||
|
:
|
||
|
bufferSize(0),
|
||
|
ptrBuffer(0),
|
||
|
ptrBufferHMV(0),
|
||
|
ptrBufferVMV(0)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
WebRtc_UWord32 bufferSize; // Size of MB buffer
|
||
|
WebRtc_UWord32* ptrBuffer; // MB buffer
|
||
|
WebRtc_UWord8* ptrBufferHMV; // Horizontal motion vector for corresponding MB
|
||
|
WebRtc_UWord8* ptrBufferVMV; // Vertical motion vector for corresponding MB
|
||
|
};
|
||
|
|
||
|
class H263Information : public VideoCodecInformation
|
||
|
{
|
||
|
public:
|
||
|
H263Information();
|
||
|
~H263Information();
|
||
|
|
||
|
/*******************************************************************************
|
||
|
* void Reset();
|
||
|
*
|
||
|
* Resets the members to zero.
|
||
|
*
|
||
|
*/
|
||
|
virtual void Reset();
|
||
|
|
||
|
virtual RtpVideoCodecTypes Type();
|
||
|
|
||
|
/*******************************************************************************
|
||
|
* WebRtc_Word32 GetInfo(WebRtc_UWord8* ptrEncodedBuffer,
|
||
|
* WebRtc_UWord32 length,
|
||
|
* const H263Info*& ptrInfo);
|
||
|
*
|
||
|
* Gets information from an encoded stream.
|
||
|
*
|
||
|
* Input:
|
||
|
* - ptrEncodedBuffer : PoWebRtc_Word32er to encoded stream.
|
||
|
* - length : Length in bytes of encoded stream.
|
||
|
*
|
||
|
* Output:
|
||
|
* - ptrInfo : PoWebRtc_Word32er to struct with H263 info.
|
||
|
*
|
||
|
* Return value:
|
||
|
* - 0 : ok
|
||
|
* - (-1) : Error
|
||
|
*/
|
||
|
virtual WebRtc_Word32 GetInfo(const WebRtc_UWord8* ptrEncodedBuffer,
|
||
|
const WebRtc_UWord32 length,
|
||
|
const H263Info*& ptrInfo);
|
||
|
|
||
|
/*******************************************************************************
|
||
|
* WebRtc_Word32 GetMBInfo(const WebRtc_UWord8* ptrEncodedBuffer,
|
||
|
* WebRtc_UWord32 length,
|
||
|
* WebRtc_Word32 numOfGOB,
|
||
|
* const H263MBInfo*& ptrInfoMB);
|
||
|
*
|
||
|
* Gets macroblock positions for a GOB.
|
||
|
* Also, the horizontal and vertical motion vector for each MB are returned.
|
||
|
*
|
||
|
* Input:
|
||
|
* - ptrEncodedBuffer : Pointer to encoded stream.
|
||
|
* - length : Length in bytes of encoded stream.
|
||
|
* - numOfGOB : Group number of current GOB.
|
||
|
*
|
||
|
* Output:
|
||
|
* - ptrInfoMB : Pointer to struct with MB positions in bits for a GOB.
|
||
|
* Horizontal and vertical motion vector for each MB.
|
||
|
*
|
||
|
* Return value:
|
||
|
* - 0 : ok
|
||
|
* - (-1) : Error
|
||
|
*/
|
||
|
WebRtc_Word32 GetMBInfo(const WebRtc_UWord8* ptrEncodedBuffer,
|
||
|
const WebRtc_UWord32 length,
|
||
|
const WebRtc_UWord8 numOfGOB,
|
||
|
const H263MBInfo*& ptrInfoMB);
|
||
|
|
||
|
protected:
|
||
|
bool HasInfo(const WebRtc_UWord32 length);
|
||
|
WebRtc_Word32 FindInfo(const WebRtc_UWord8* ptrEncodedBuffer, const WebRtc_UWord32 length);
|
||
|
|
||
|
bool PictureStartCode();
|
||
|
WebRtc_Word32 FindPTypeFMT();
|
||
|
void FindFType();
|
||
|
void FindCodecBits();
|
||
|
void FindPQUANT();
|
||
|
void FindCPMbit();
|
||
|
WebRtc_Word32 SetNumOfMBs();
|
||
|
|
||
|
WebRtc_Word32 FindGOBs(const WebRtc_UWord32 length);
|
||
|
|
||
|
// MB info
|
||
|
WebRtc_Word32 VerifyAndAllocateMB();
|
||
|
bool HasMBInfo(const WebRtc_UWord8 numOfGOB);
|
||
|
WebRtc_Word32 FindMBs(const WebRtc_UWord8* ptrEncodedBuffer,
|
||
|
const WebRtc_UWord8 numOfGOB,
|
||
|
const WebRtc_UWord32 length);
|
||
|
|
||
|
void FindGQUANT(WebRtc_Word32 numOfGOB);
|
||
|
WebRtc_Word32 FindMCBPC(WebRtc_Word32 &mbType, char *cbp);
|
||
|
WebRtc_Word32 FindCBPY(WebRtc_Word32 mbType, char *cbp);
|
||
|
WebRtc_Word32 FindMVD(WebRtc_Word32 numOfMB, WebRtc_Word32 verORhor, WebRtc_UWord8 *hmv1, WebRtc_UWord8 *vmv1);
|
||
|
WebRtc_Word32 FindTCOEF(WebRtc_Word32 &last);
|
||
|
bool IsGBSC();
|
||
|
WebRtc_UWord8 IsBitOne(const WebRtc_Word32 bitCnt) const;
|
||
|
void ByteAlignData(WebRtc_Word32 numOfBytes);
|
||
|
void OutputBits(WebRtc_Word32 length);
|
||
|
|
||
|
private:
|
||
|
WebRtc_Word32 _bitCnt;
|
||
|
const WebRtc_UWord8* _ptrData;
|
||
|
WebRtc_UWord8 _dataShifted[5];
|
||
|
|
||
|
H263Info _info;
|
||
|
H263MBInfo _infoMB;
|
||
|
};
|
||
|
} // namespace webrtc
|
||
|
|
||
|
#endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_H263_INFORMATION_H_
|