nal: Add the writing of an additional zero_byte before the start code.

Enables the output of spec-compliant byte streams, as the specification
notes that an additional zero_byte has to be added under certain
circuimstances.
This commit is contained in:
Yusuke Nakamura 2014-02-03 22:31:58 +09:00 committed by Marko Viitanen
parent d69f97cb90
commit 4ffdb358ed
3 changed files with 16 additions and 8 deletions

View file

@ -304,7 +304,7 @@ void encode_one_frame(encoder_control* encoder)
bitstream_align(encoder->stream);
bitstream_flush(encoder->stream);
nal_write(encoder->output, encoder->stream->buffer,
encoder->stream->buffer_pos, 0, NAL_VPS_NUT, 0);
encoder->stream->buffer_pos, 0, NAL_VPS_NUT, 0, 1);
bitstream_clear_buffer(encoder->stream);
// Sequence Parameter Set (SPS)
@ -312,7 +312,7 @@ void encode_one_frame(encoder_control* encoder)
bitstream_align(encoder->stream);
bitstream_flush(encoder->stream);
nal_write(encoder->output, encoder->stream->buffer,
encoder->stream->buffer_pos, 0, NAL_SPS_NUT, 0);
encoder->stream->buffer_pos, 0, NAL_SPS_NUT, 0, 1);
bitstream_clear_buffer(encoder->stream);
// Picture Parameter Set (PPS)
@ -320,7 +320,7 @@ void encode_one_frame(encoder_control* encoder)
bitstream_align(encoder->stream);
bitstream_flush(encoder->stream);
nal_write(encoder->output, encoder->stream->buffer,
encoder->stream->buffer_pos, 0, NAL_PPS_NUT, 0);
encoder->stream->buffer_pos, 0, NAL_PPS_NUT, 0, 1);
bitstream_clear_buffer(encoder->stream);
// First slice is IDR
@ -337,7 +337,7 @@ void encode_one_frame(encoder_control* encoder)
bitstream_align(encoder->stream);
bitstream_flush(encoder->stream);
nal_write(encoder->output, encoder->stream->buffer,
encoder->stream->buffer_pos, 0, NAL_IDR_W_RADL, 0);
encoder->stream->buffer_pos, 0, NAL_IDR_W_RADL, 0, 0);
bitstream_clear_buffer(encoder->stream);
} else {
cabac_start(&cabac);
@ -354,7 +354,7 @@ void encode_one_frame(encoder_control* encoder)
bitstream_align(encoder->stream);
bitstream_flush(encoder->stream);
nal_write(encoder->output, encoder->stream->buffer,
encoder->stream->buffer_pos, 0, NAL_TRAIL_R, 0);
encoder->stream->buffer_pos, 0, NAL_TRAIL_R, 0, 1);
bitstream_clear_buffer(encoder->stream);
}
@ -462,7 +462,7 @@ static void add_checksum(encoder_control* encoder)
bitstream_align(encoder->stream);
bitstream_flush(encoder->stream);
nal_write(encoder->output, encoder->stream->buffer,
encoder->stream->buffer_pos, 0, NAL_SUFFIT_SEI_NUT, 0);
encoder->stream->buffer_pos, 0, NAL_SUFFIT_SEI_NUT, 0, 0);
bitstream_clear_buffer(encoder->stream);
}

View file

@ -35,7 +35,9 @@
/**
* \brief Write a Network Abstraction Layer (NAL) packet to the output.
*/
void nal_write(FILE *output, uint8_t *buffer, uint32_t buffer_len, uint8_t nal_ref, uint8_t nal_type, uint8_t temporal_id)
void nal_write(FILE *output, uint8_t *buffer, uint32_t buffer_len,
uint8_t nal_ref, uint8_t nal_type, uint8_t temporal_id,
int long_start_code)
{
uint8_t byte;
uint32_t i;
@ -46,6 +48,11 @@ void nal_write(FILE *output, uint8_t *buffer, uint32_t buffer_len, uint8_t nal_r
const uint8_t start_code_prefix_one_3bytes = 0x01;
const uint8_t zero = 0x00;
// zero_byte (0x00) shall be present in the byte stream NALU of VPS, SPS
// and PPS, or the first NALU of an access unit
if(long_start_code)
fwrite(&zero, 1, 1, output);
// start_code_prefix_one_3bytes
fwrite(&zero, 1, 1, output);
fwrite(&zero, 1, 1, output);

View file

@ -93,7 +93,8 @@ enum {
//////////////////////////////////////////////////////////////////////////
// FUNCTIONS
void nal_write(FILE *output, uint8_t *buffer, uint32_t buffer_len,
uint8_t nal_ref, uint8_t nal_type, uint8_t temporal_id);
uint8_t nal_ref, uint8_t nal_type, uint8_t temporal_id,
int long_start_code);
void picture_checksum(const picture *pic,
unsigned char checksum_out[][SEI_HASH_MAX_LENGTH]);