From f750c2494852ab3437b7f88d2f1571ec0ce4c8e8 Mon Sep 17 00:00:00 2001 From: Ari Koivula Date: Thu, 19 Sep 2013 16:03:02 +0300 Subject: [PATCH] Refactor: nal.c/.h full cleanup. - Move constant from the signature of calc_checksum into a macro. --- src/encoder.c | 2 +- src/nal.c | 83 ++++++++++++++++++++++++--------------------------- src/nal.h | 19 +++++++++--- 3 files changed, 55 insertions(+), 49 deletions(-) diff --git a/src/encoder.c b/src/encoder.c index c4d4bb26..49c6978c 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -448,7 +448,7 @@ void read_one_frame(FILE* file, encoder_control* encoder) */ static void add_checksum(encoder_control* encoder) { - unsigned char checksum[3][16]; + unsigned char checksum[3][SEI_HASH_MAX_LENGTH]; uint32_t checksum_val; unsigned int i; diff --git a/src/nal.c b/src/nal.c index 6b14b5d5..eb5de6cd 100644 --- a/src/nal.c +++ b/src/nal.c @@ -13,89 +13,84 @@ #include #include +#include #include "config.h" #include "bitstream.h" #include "cabac.h" #include "encoder.h" - -void nal_write(FILE* output, uint8_t* buffer, uint32_t buffer_len, uint8_t nal_ref, uint8_t nal_type, uint8_t temporal_id) +/** + * \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) { uint8_t byte; uint32_t i; - uint8_t zerocount=0; + uint8_t zerocount = 0; - /* Some useful constants */ + // Some useful constants const uint8_t emulation_prevention_three_byte = 0x03; const uint8_t start_code_prefix_one_3bytes = 0x01; const uint8_t zero = 0x00; - /*start_code_prefix_one_3bytes */ - - /* - if(temporal_id == 0) - { - fwrite(&zero, 1, 1, output); - } - */ + // start_code_prefix_one_3bytes fwrite(&zero, 1, 1, output); fwrite(&zero, 1, 1, output); fwrite(&start_code_prefix_one_3bytes, 1, 1, output); - /* Handle header bits with full bytes instead of using bitstream */ - /* forbidden_zero_flag(1) + nal_unit_type(6) + 1bit of nuh_layer_id*/ - byte = nal_type<<1; + // Handle header bits with full bytes instead of using bitstream + // forbidden_zero_flag(1) + nal_unit_type(6) + 1bit of nuh_layer_id + byte = nal_type << 1; fwrite(&byte, 1, 1, output); - /* 5bits of nuh_layer_id + nuh_temporal_id_plus1(3) */ - byte = (temporal_id+1)&7; + // 5bits of nuh_layer_id + nuh_temporal_id_plus1(3) + byte = (temporal_id + 1) & 7; fwrite(&byte, 1, 1, output); - /* Write out bytes and add emulation_prevention_three_byte when needed */ - for(i = 0; i < buffer_len; i++) - { - if(zerocount == 2 && buffer[i] < 4) /* Prevent 0x0000 + 00/01/02/03 */ - { - /* Inserting 0x03 */ + // Write out bytes and add emulation_prevention_three_byte when needed + for (i = 0; i < buffer_len; ++i) { + // Prevent 0x0000 + 00/01/02 byte sequences from occurring by prefixing + // the last byte with 0x03. Do the same for 0x03. + if (zerocount == 2 && buffer[i] < 4) { fwrite(&emulation_prevention_three_byte, 1, 1, output); zerocount = 0; } - if(buffer[i] == 0) - { + if(buffer[i] == 0) { zerocount++; - } - else - { + } else { zerocount = 0; } - /* Write the actual data */ + // Write the actual data fwrite(&buffer[i], 1, 1, output); } - /* If last byte was 0, add emulation_prevention_three_byte */ - if(buffer[buffer_len-1] == 0) - { + // If last byte was 0, add emulation_prevention_three_byte + if (buffer[buffer_len - 1] == 0) { fwrite(&emulation_prevention_three_byte, 1, 1, output); } - } -/*! - \brief Calculate checksum for one color of the picture. - \param data Beginning of the pixel data for the picture. - \param height Height of the picture. - \param width Width of the picture. - \param stride Width of one row in the pixel array. - \returns Void -*/ -static void array_checksum(const uint8_t* data, const int height, const int width, const int stride, unsigned char checksum_out[]) +/** + * \brief Calculate checksum for one color of the picture. + * \param data Beginning of the pixel data for the picture. + * \param height Height of the picture. + * \param width Width of the picture. + * \param stride Width of one row in the pixel array. + */ +static void array_checksum(const uint8_t* data, + const int height, const int width, + const int stride, + unsigned char checksum_out[SEI_HASH_MAX_LENGTH]) { unsigned char mask; unsigned int checksum = 0; int y, x; + + assert(SEI_HASH_MAX_LENGTH >= 4); + for (y = 0; y < height; ++y) { for (x = 0; x < width; ++x) { mask = (x & 0xff) ^ (y & 0xff) ^ (x >> 8) ^ (y >> 8); @@ -104,7 +99,7 @@ static void array_checksum(const uint8_t* data, const int height, const int widt } } - /* Unpack uint into byte-array.*/ + // Unpack uint into byte-array. checksum_out[0] = (checksum >> 24) & 0xff; checksum_out[1] = (checksum >> 16) & 0xff; checksum_out[2] = (checksum >> 8) & 0xff; @@ -118,7 +113,7 @@ static void array_checksum(const uint8_t* data, const int height, const int widt \param checksum_out Result of the calculation. \returns Void */ -void picture_checksum(const picture* pic, unsigned char checksum_out[][16]) +void picture_checksum(const picture* pic, unsigned char checksum_out[][SEI_HASH_MAX_LENGTH]) { int stride = pic->width; /* TODO: != width, if there is a luma margin. */ array_checksum(pic->y_recdata, pic->height, pic->width, pic->width, checksum_out[0]); diff --git a/src/nal.h b/src/nal.h index dd6e56c5..ef59bc44 100644 --- a/src/nal.h +++ b/src/nal.h @@ -19,8 +19,11 @@ #include "picture.h" -/*! - * \brief NAL unit type codes +////////////////////////////////////////////////////////////////////////// +// TYPES + +/** + * \brief NAL unit type codes. * * These are the nal_unit_type codes from Table 7-1 ITU-T H.265 v1.0. * The type codes have been prefixed with "NAL_". @@ -73,7 +76,15 @@ enum { // Unspecified UNSPEC 48-63 }; -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 picture_checksum(const picture* pic, unsigned char checksum_out[][16]); +#define SEI_HASH_MAX_LENGTH 4 + +////////////////////////////////////////////////////////////////////////// +// 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); +void picture_checksum(const picture *pic, + unsigned char checksum_out[][SEI_HASH_MAX_LENGTH]); + + #endif