blob: 73fdc632ab6edd34b4847127818766ae74757cd9 [file] [log] [blame]
/*
* Copyright © Microsoft Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
#ifndef D3D12_VIDEO_ENC_BITSTREAM_H
#define D3D12_VIDEO_ENC_BITSTREAM_H
#include "d3d12_video_types.h"
class d3d12_video_encoder_bitstream
{
public:
d3d12_video_encoder_bitstream();
~d3d12_video_encoder_bitstream();
public:
void get_current_buffer_position_and_size(uint8_t **ppCurrBufPos, int32_t *pdwLeftBufSize);
void inc_current_offset(int32_t dwOffset);
bool create_bitstream(uint32_t uiInitBufferSize);
void setup_bitstream(uint32_t uiInitBufferSize, uint8_t *pBuffer);
void attach(uint8_t *pBitsBuffer, uint32_t uiBufferSize);
void put_bits(int32_t uiBitsCount, uint32_t iBitsVal);
void flush();
void exp_Golomb_ue(uint32_t uiVal);
void exp_Golomb_se(int32_t iVal);
inline void clear()
{
m_iBitsToGo = 32;
m_uiOffset = 0;
m_uintEncBuffer = 0;
};
void append_byte_stream(d3d12_video_encoder_bitstream *pStream);
void set_start_code_prevention(bool bSCP)
{
m_bPreventStartCode = bSCP;
}
int32_t get_bits_count()
{
return m_uiOffset * 8 + (32 - m_iBitsToGo);
}
int32_t get_byte_count()
{
return m_uiOffset + ((32 - m_iBitsToGo) >> 3);
}
uint8_t *get_bitstream_buffer()
{
return m_pBitsBuffer;
}
bool is_byte_aligned()
{
if (m_bBufferOverflow) {
m_iBitsToGo = 32;
}
return !(m_iBitsToGo & 7);
}
int32_t get_num_bits_for_byte_align()
{
return (m_iBitsToGo & 7);
}
bool get_start_code_prevention_status()
{
return m_bPreventStartCode;
}
bool verify_buffer(uint32_t uiBytesToWrite);
public:
bool m_bBufferOverflow;
bool m_bAllowReallocate;
private:
void write_byte_start_code_prevention(uint8_t u8Val);
bool reallocate_buffer();
int32_t get_exp_golomb0_code_len(uint32_t uiVal);
const uint8_t m_iLog_2_N[256] = {
0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
};
private:
uint8_t *m_pBitsBuffer;
uint32_t m_uiBitsBufferSize;
uint32_t m_uiOffset;
bool m_bExternalBuffer;
uint32_t m_uintEncBuffer;
int32_t m_iBitsToGo;
bool m_bPreventStartCode;
};
#endif