diff --git a/src/bitstream.c b/src/bitstream.c index 212c234d..17829c70 100644 --- a/src/bitstream.c +++ b/src/bitstream.c @@ -19,7 +19,9 @@ #include "global.h" #include "bitstream.h" - + +//#define VERBOSE + #ifdef VERBOSE void printf_bitstream(char *msg, ...) { @@ -32,7 +34,7 @@ void printf_bitstream(char *msg, ...) } #endif -bitTable *exp_table; +bitTable *g_exp_table; //From wikipedia //http://en.wikipedia.org/wiki/Binary_logarithm#Algorithm @@ -52,14 +54,14 @@ void init_exp_golomb(uint32_t len) uint32_t code_num; uint32_t M; uint32_t info; - exp_table=(bitTable*)malloc(len*sizeof(bitTable)); + g_exp_table=(bitTable*)malloc(len*sizeof(bitTable)); for(code_num=0;code_numcur_byte=0; stream->cur_bit=0; - stream->output = 0; memset(stream->data, 0, sizeof(uint32_t)*32); } @@ -97,51 +98,52 @@ void bitstream_alloc(bitstream* stream, uint32_t alloc) void bitstream_put(bitstream* stream, uint32_t data, uint8_t bits) { - uint8_t i=0; - uint32_t bitsleft=32-stream->cur_bit; - #ifdef VERBOSE - printf_bitstream("put: "); - for(i=0;icur_bit; + #ifdef VERBOSE + uint8_t i=0; + printf_bitstream("put: "); + for(i=0;idata[stream->cur_byte] |= (data<<((bitsleft-bits))); - stream->cur_bit+=bits; - bits=0; - } - //No space for everything, store the bits we can and continue later - else - { - stream->data[stream->cur_byte] |= (data>>(bits-bitsleft)); - stream->cur_bit=32; - bits-=bitsleft; - } + //Theres space for all the bits + if(bits<=bitsleft) + { + stream->data[stream->cur_byte] |= (data<<((bitsleft-bits))); + stream->cur_bit+=bits; + bits=0; + } + //No space for everything, store the bits we can and continue later + else + { + stream->data[stream->cur_byte] |= (data>>(bits-bitsleft)); + stream->cur_bit=32; + bits-=bitsleft; + } - //Check if the buffer is full - if(stream->cur_bit==32) + //Check if the buffer is full + if(stream->cur_bit==32) + { + bitsleft=32; + stream->cur_byte++; + stream->cur_bit = 0; + if(stream->cur_byte==32) { - stream->cur_byte++; - bitsleft=32; - if(stream->cur_byte==32) - { - //Flush data out - bitstream_flush(stream); - } + //Flush data out + bitstream_flush(stream); } + } - //..still some writing to do - if(bits!=0) - { - stream->data[stream->cur_byte] |= (data<<(bitsleft-bits)); - stream->cur_bit+=bits; - } + //..still some writing to do + if(bits!=0) + { + stream->data[stream->cur_byte] |= (data<<(bitsleft-bits)); + stream->cur_bit+=bits; + } @@ -152,7 +154,7 @@ void bitstream_put(bitstream* stream, uint32_t data, uint8_t bits) */ void bitstream_align(bitstream* stream) { - if(stream->cur_bit&7 != 0) + if((stream->cur_bit&7) != 0) { bitstream_put(stream,0, 8-stream->cur_bit&7); } @@ -163,11 +165,12 @@ void bitstream_flush(bitstream* stream) /* * SAVE DATA TO OUTPUT */ + int i,j; if(stream->output) { if(stream->cur_byte) { - fwrite(stream->data, stream->cur_byte*4, 1, stream->output); + fwrite(&stream->data[0], stream->cur_byte*4, 1, stream->output); } if(stream->cur_bit>>3) @@ -175,19 +178,27 @@ void bitstream_flush(bitstream* stream) fwrite(&stream->data[stream->cur_byte], stream->cur_bit>>3, 1, stream->output); } } + /* No file open, write to buffer */ else { if(stream->cur_byte) { - memcpy(&stream->buffer[stream->buffer_pos],&stream->data[0],stream->cur_byte*4); + //memcpy((uint8_t*)&stream->buffer[stream->buffer_pos],(uint8_t*)stream->data,stream->cur_byte*4); + + for(i = 0,j=3; i < stream->cur_byte*4; i++,j--) + { + if(j == -1) j = 3; + stream->buffer[stream->buffer_pos+i] = ((uint8_t*)stream->data)[((i>>2)<<2)+j]; + } + stream->buffer_pos += stream->cur_byte*4; } - if(stream->cur_bit>>3) - { - memcpy(&stream->buffer[stream->buffer_pos],&stream->data[stream->cur_byte],stream->cur_bit>>3); - stream->buffer_pos += stream->cur_bit>>3; - } + if(stream->cur_bit>>3) + { + memcpy((uint8_t*)&stream->buffer[stream->buffer_pos],(uint8_t*)&stream->data[stream->cur_byte],stream->cur_bit>>3); + stream->buffer_pos += stream->cur_bit>>3; + } } //Stream flushed, zero out the values bitstream_init(stream); diff --git a/src/bitstream.h b/src/bitstream.h index 91a304bd..b1def31b 100644 --- a/src/bitstream.h +++ b/src/bitstream.h @@ -25,7 +25,7 @@ typedef struct uint32_t value; }bitTable; -extern bitTable *exp_table; +extern bitTable *g_exp_table; int floorLog2(unsigned int n); @@ -36,9 +36,9 @@ void bitstream_put(bitstream* stream, uint32_t data, uint8_t bits); void bitstream_put_ue(bitstream* stream, uint32_t data); void bitstream_put_se(bitstream* stream, uint32_t data); */ -#define bitstream_put_ue(stream, data) { bitstream_put(stream,exp_table[data].value,exp_table[data].len); } +#define bitstream_put_ue(stream, data) { bitstream_put(stream,g_exp_table[data].value,g_exp_table[data].len); } #define bitstream_put_se(stream, data) { uint32_t index=(data<=0)?2*(uint32_t)(-data):2*(uint32_t)(data)-1; \ - bitstream_put(stream,exp_table[index].value,exp_table[index].len); } + bitstream_put(stream,g_exp_table[index].value,g_exp_table[index].len); } void bitstream_align(bitstream* stream); void bitstream_flush(bitstream* stream); @@ -46,9 +46,9 @@ void init_exp_golomb(uint32_t len); #ifdef _DEBUG static int WRITE_VALUE = 0; -#define WRITE_U(stream, data, bits, name) { printf("%8d %40s u(%d) : %d\n",WRITE_VALUE, name,bits,data); bitstream_put(stream,data,bits); WRITE_VALUE++;} -#define WRITE_UE(stream, data, name) { printf("%8d %40s ue(v): %d\n",WRITE_VALUE, name,data); bitstream_put_ue(stream,data); WRITE_VALUE++;} -#define WRITE_SE(stream, data, name) { printf("%8d %40s se(v): %d\n",WRITE_VALUE, name,data); bitstream_put_se(stream,data); WRITE_VALUE++;} +#define WRITE_U(stream, data, bits, name) { printf("%8d %-40s u(%d) : %d\n",WRITE_VALUE, name,bits,data); bitstream_put(stream,data,bits); WRITE_VALUE++;} +#define WRITE_UE(stream, data, name) { printf("%8d %-40s ue(v): %d\n",WRITE_VALUE, name,data); bitstream_put_ue(stream,data); WRITE_VALUE++;} +#define WRITE_SE(stream, data, name) { printf("%8d %-40s se(v): %d\n",WRITE_VALUE, name,data); bitstream_put_se(stream,data); WRITE_VALUE++;} #else #define WRITE_U(stream, data, bits, name) { bitstream_put(stream,data,bits); } #define WRITE_UE(stream, data, name) { bitstream_put_ue(stream,data); } diff --git a/src/encmain.c b/src/encmain.c index c2f7f697..d35fe396 100644 --- a/src/encmain.c +++ b/src/encmain.c @@ -80,14 +80,14 @@ return EXIT_FAILURE; } - printf("Input: %s, output: %s\r\n", cfg->input, cfg->output); - printf(" Video size: %dx%d\r\n", cfg->width, cfg->height); + printf("Input: %s, output: %s\n", cfg->input, cfg->output); + printf(" Video size: %dx%d\n", cfg->width, cfg->height); /* Open input file and check that it was opened correctly */ input = fopen(cfg->input, "rb"); if(input == NULL) { - fprintf(stderr, "Could not open input file, shutting down!\r\n"); + fprintf(stderr, "Could not open input file, shutting down!\n"); config_destroy(cfg); return EXIT_FAILURE; } @@ -96,7 +96,7 @@ output = fopen(cfg->output, "wb"); if(output == NULL) { - fprintf(stderr, "Could not open output file, shutting down!\r\n"); + fprintf(stderr, "Could not open output file, shutting down!\n"); config_destroy(cfg); return EXIT_FAILURE; } @@ -109,6 +109,7 @@ /* Init bitstream */ bitstream_init(encoder->stream); encoder->stream->buffer_pos = 0; + encoder->stream->output = 0; bitstream_alloc(encoder->stream, 1024*1024); /* Config pointer to encoder struct */ @@ -134,7 +135,7 @@ } /* Coding finished */ - + printf(" Processed %d frames\n", encoder->frame-1); fclose(input); fclose(output); diff --git a/src/encoder.c b/src/encoder.c index 021561de..125ca558 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -56,7 +56,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, 1, NAL_PIC_PARAMETER_SET, 0); - + } } diff --git a/src/nal.c b/src/nal.c index 7ffb4ee9..5d25637c 100644 --- a/src/nal.c +++ b/src/nal.c @@ -62,7 +62,7 @@ void nal_write(FILE* output, uint8_t* buffer, uint32_t buffer_len, uint8_t nal_r fwrite(&buffer[i], 1, 1, output); } //If last byte was 0, add emulation_prevention_three_byte - if(buffer[buffer_len-1] == 0) - fwrite(&emulation_prevention_three_byte, 1, 1, output); + //if(buffer[buffer_len-1] == 0) + // fwrite(&emulation_prevention_three_byte, 1, 1, output); } \ No newline at end of file