byte-order fix

This commit is contained in:
Marko Viitanen 2012-06-05 17:45:17 +03:00
parent a56a1c9aa6
commit e202eb2f91
5 changed files with 80 additions and 68 deletions

View file

@ -19,7 +19,9 @@
#include "global.h" #include "global.h"
#include "bitstream.h" #include "bitstream.h"
//#define VERBOSE
#ifdef VERBOSE #ifdef VERBOSE
void printf_bitstream(char *msg, ...) void printf_bitstream(char *msg, ...)
{ {
@ -32,7 +34,7 @@ void printf_bitstream(char *msg, ...)
} }
#endif #endif
bitTable *exp_table; bitTable *g_exp_table;
//From wikipedia //From wikipedia
//http://en.wikipedia.org/wiki/Binary_logarithm#Algorithm //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 code_num;
uint32_t M; uint32_t M;
uint32_t info; uint32_t info;
exp_table=(bitTable*)malloc(len*sizeof(bitTable)); g_exp_table=(bitTable*)malloc(len*sizeof(bitTable));
for(code_num=0;code_num<len;code_num++) for(code_num=0;code_num<len;code_num++)
{ {
M=(uint32_t)floorLog2(code_num+1); M=(uint32_t)floorLog2(code_num+1);
info=code_num+1-(uint32_t)pow(2,M); info=code_num+1-(uint32_t)pow(2,M);
exp_table[code_num].len=M*2+1; g_exp_table[code_num].len=M*2+1;
exp_table[code_num].value=(1<<M)|info; g_exp_table[code_num].value=(1<<M)|info;
//printf_cavlc("Len: %i %x\n", M*2+1, (1<<M)|info); //printf_cavlc("Len: %i %x\n", M*2+1, (1<<M)|info);
} }
} }
@ -71,7 +73,6 @@ void bitstream_init(bitstream* stream)
{ {
stream->cur_byte=0; stream->cur_byte=0;
stream->cur_bit=0; stream->cur_bit=0;
stream->output = 0;
memset(stream->data, 0, sizeof(uint32_t)*32); 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) void bitstream_put(bitstream* stream, uint32_t data, uint8_t bits)
{ {
uint8_t i=0; uint32_t bitsleft=32-stream->cur_bit;
uint32_t bitsleft=32-stream->cur_bit; #ifdef VERBOSE
#ifdef VERBOSE uint8_t i=0;
printf_bitstream("put: "); printf_bitstream("put: ");
for(i=0;i<bits;i++) for(i=0;i<bits;i++)
{ {
printf("%i",(data&(1<<(bits-i-1)))?1:0); printf("%i",(data&(1<<(bits-i-1)))?1:0);
} }
printf_bitstream("\n"); printf_bitstream("\n");
//printf_bitstream(" count: %i\n",bits); //printf_bitstream(" count: %i\n",bits);
#endif #endif
//Theres space for all the bits //Theres space for all the bits
if(bits<=bitsleft) if(bits<=bitsleft)
{ {
stream->data[stream->cur_byte] |= (data<<((bitsleft-bits))); stream->data[stream->cur_byte] |= (data<<((bitsleft-bits)));
stream->cur_bit+=bits; stream->cur_bit+=bits;
bits=0; bits=0;
} }
//No space for everything, store the bits we can and continue later //No space for everything, store the bits we can and continue later
else else
{ {
stream->data[stream->cur_byte] |= (data>>(bits-bitsleft)); stream->data[stream->cur_byte] |= (data>>(bits-bitsleft));
stream->cur_bit=32; stream->cur_bit=32;
bits-=bitsleft; bits-=bitsleft;
} }
//Check if the buffer is full //Check if the buffer is full
if(stream->cur_bit==32) if(stream->cur_bit==32)
{
bitsleft=32;
stream->cur_byte++;
stream->cur_bit = 0;
if(stream->cur_byte==32)
{ {
stream->cur_byte++; //Flush data out
bitsleft=32; bitstream_flush(stream);
if(stream->cur_byte==32)
{
//Flush data out
bitstream_flush(stream);
}
} }
}
//..still some writing to do //..still some writing to do
if(bits!=0) if(bits!=0)
{ {
stream->data[stream->cur_byte] |= (data<<(bitsleft-bits)); stream->data[stream->cur_byte] |= (data<<(bitsleft-bits));
stream->cur_bit+=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) 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); bitstream_put(stream,0, 8-stream->cur_bit&7);
} }
@ -163,11 +165,12 @@ void bitstream_flush(bitstream* stream)
/* /*
* SAVE DATA TO OUTPUT * SAVE DATA TO OUTPUT
*/ */
int i,j;
if(stream->output) if(stream->output)
{ {
if(stream->cur_byte) 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) 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); fwrite(&stream->data[stream->cur_byte], stream->cur_bit>>3, 1, stream->output);
} }
} }
/* No file open, write to buffer */
else else
{ {
if(stream->cur_byte) 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; stream->buffer_pos += stream->cur_byte*4;
} }
if(stream->cur_bit>>3) if(stream->cur_bit>>3)
{ {
memcpy(&stream->buffer[stream->buffer_pos],&stream->data[stream->cur_byte],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->buffer_pos += stream->cur_bit>>3;
} }
} }
//Stream flushed, zero out the values //Stream flushed, zero out the values
bitstream_init(stream); bitstream_init(stream);

View file

@ -25,7 +25,7 @@ typedef struct
uint32_t value; uint32_t value;
}bitTable; }bitTable;
extern bitTable *exp_table; extern bitTable *g_exp_table;
int floorLog2(unsigned int n); 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_ue(bitstream* stream, uint32_t data);
void bitstream_put_se(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; \ #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_align(bitstream* stream);
void bitstream_flush(bitstream* stream); void bitstream_flush(bitstream* stream);
@ -46,9 +46,9 @@ void init_exp_golomb(uint32_t len);
#ifdef _DEBUG #ifdef _DEBUG
static int WRITE_VALUE = 0; 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_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_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_SE(stream, data, name) { printf("%8d %-40s se(v): %d\n",WRITE_VALUE, name,data); bitstream_put_se(stream,data); WRITE_VALUE++;}
#else #else
#define WRITE_U(stream, data, bits, name) { bitstream_put(stream,data,bits); } #define WRITE_U(stream, data, bits, name) { bitstream_put(stream,data,bits); }
#define WRITE_UE(stream, data, name) { bitstream_put_ue(stream,data); } #define WRITE_UE(stream, data, name) { bitstream_put_ue(stream,data); }

View file

@ -80,14 +80,14 @@
return EXIT_FAILURE; return EXIT_FAILURE;
} }
printf("Input: %s, output: %s\r\n", cfg->input, cfg->output); printf("Input: %s, output: %s\n", cfg->input, cfg->output);
printf(" Video size: %dx%d\r\n", cfg->width, cfg->height); printf(" Video size: %dx%d\n", cfg->width, cfg->height);
/* Open input file and check that it was opened correctly */ /* Open input file and check that it was opened correctly */
input = fopen(cfg->input, "rb"); input = fopen(cfg->input, "rb");
if(input == NULL) 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); config_destroy(cfg);
return EXIT_FAILURE; return EXIT_FAILURE;
} }
@ -96,7 +96,7 @@
output = fopen(cfg->output, "wb"); output = fopen(cfg->output, "wb");
if(output == NULL) 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); config_destroy(cfg);
return EXIT_FAILURE; return EXIT_FAILURE;
} }
@ -109,6 +109,7 @@
/* Init bitstream */ /* Init bitstream */
bitstream_init(encoder->stream); bitstream_init(encoder->stream);
encoder->stream->buffer_pos = 0; encoder->stream->buffer_pos = 0;
encoder->stream->output = 0;
bitstream_alloc(encoder->stream, 1024*1024); bitstream_alloc(encoder->stream, 1024*1024);
/* Config pointer to encoder struct */ /* Config pointer to encoder struct */
@ -134,7 +135,7 @@
} }
/* Coding finished */ /* Coding finished */
printf(" Processed %d frames\n", encoder->frame-1);
fclose(input); fclose(input);
fclose(output); fclose(output);

View file

@ -56,7 +56,7 @@ void encode_one_frame(encoder_control* encoder)
bitstream_align(encoder->stream); bitstream_align(encoder->stream);
bitstream_flush(encoder->stream); bitstream_flush(encoder->stream);
nal_write(encoder->output, encoder->stream->buffer, encoder->stream->buffer_pos, 1, NAL_PIC_PARAMETER_SET, 0); nal_write(encoder->output, encoder->stream->buffer, encoder->stream->buffer_pos, 1, NAL_PIC_PARAMETER_SET, 0);
} }
} }

View file

@ -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); fwrite(&buffer[i], 1, 1, output);
} }
//If last byte was 0, add emulation_prevention_three_byte //If last byte was 0, add emulation_prevention_three_byte
if(buffer[buffer_len-1] == 0) //if(buffer[buffer_len-1] == 0)
fwrite(&emulation_prevention_three_byte, 1, 1, output); // fwrite(&emulation_prevention_three_byte, 1, 1, output);
} }