This adds functions to send and receive doubles and also null terminated strings. Originally committed as revision 919 to svn://svn.ffmpeg.org/ffmpeg/trunktags/v0.5
| @@ -78,7 +78,7 @@ int init_put_byte(ByteIOContext *s, | |||||
| int (*seek)(void *opaque, offset_t offset, int whence)); | int (*seek)(void *opaque, offset_t offset, int whence)); | ||||
| void put_byte(ByteIOContext *s, int b); | void put_byte(ByteIOContext *s, int b); | ||||
| void put_buffer(ByteIOContext *s, unsigned char *buf, int size); | |||||
| void put_buffer(ByteIOContext *s, const unsigned char *buf, int size); | |||||
| void put_le64(ByteIOContext *s, UINT64 val); | void put_le64(ByteIOContext *s, UINT64 val); | ||||
| void put_be64(ByteIOContext *s, UINT64 val); | void put_be64(ByteIOContext *s, UINT64 val); | ||||
| void put_le32(ByteIOContext *s, unsigned int val); | void put_le32(ByteIOContext *s, unsigned int val); | ||||
| @@ -87,6 +87,9 @@ void put_le16(ByteIOContext *s, unsigned int val); | |||||
| void put_be16(ByteIOContext *s, unsigned int val); | void put_be16(ByteIOContext *s, unsigned int val); | ||||
| void put_tag(ByteIOContext *s, char *tag); | void put_tag(ByteIOContext *s, char *tag); | ||||
| void put_native_double(ByteIOContext *s, double val); | |||||
| void put_native_string(ByteIOContext *s, const char *buf); | |||||
| offset_t url_fseek(ByteIOContext *s, offset_t offset, int whence); | offset_t url_fseek(ByteIOContext *s, offset_t offset, int whence); | ||||
| void url_fskip(ByteIOContext *s, offset_t offset); | void url_fskip(ByteIOContext *s, offset_t offset); | ||||
| offset_t url_ftell(ByteIOContext *s); | offset_t url_ftell(ByteIOContext *s); | ||||
| @@ -105,6 +108,8 @@ unsigned int get_le32(ByteIOContext *s); | |||||
| UINT64 get_le64(ByteIOContext *s); | UINT64 get_le64(ByteIOContext *s); | ||||
| unsigned int get_le16(ByteIOContext *s); | unsigned int get_le16(ByteIOContext *s); | ||||
| double get_native_double(ByteIOContext *s); | |||||
| char *get_native_string(ByteIOContext *s, char *buf, int maxlen); | |||||
| unsigned int get_be16(ByteIOContext *s); | unsigned int get_be16(ByteIOContext *s); | ||||
| unsigned int get_be32(ByteIOContext *s); | unsigned int get_be32(ByteIOContext *s); | ||||
| UINT64 get_be64(ByteIOContext *s); | UINT64 get_be64(ByteIOContext *s); | ||||
| @@ -68,7 +68,7 @@ void put_byte(ByteIOContext *s, int b) | |||||
| flush_buffer(s); | flush_buffer(s); | ||||
| } | } | ||||
| void put_buffer(ByteIOContext *s, unsigned char *buf, int size) | |||||
| void put_buffer(ByteIOContext *s, const unsigned char *buf, int size) | |||||
| { | { | ||||
| int len; | int len; | ||||
| @@ -176,6 +176,19 @@ void put_be32(ByteIOContext *s, unsigned int val) | |||||
| put_byte(s, val); | put_byte(s, val); | ||||
| } | } | ||||
| void put_native_double(ByteIOContext *s, double val) | |||||
| { | |||||
| put_buffer(s, (const unsigned char *) &val, sizeof(val)); | |||||
| } | |||||
| void put_native_string(ByteIOContext *s, const char *str) | |||||
| { | |||||
| if (str) | |||||
| put_buffer(s, (const unsigned char *) str, strlen(str) + 1); | |||||
| else | |||||
| put_byte(s, 0); | |||||
| } | |||||
| void put_le64(ByteIOContext *s, UINT64 val) | void put_le64(ByteIOContext *s, UINT64 val) | ||||
| { | { | ||||
| put_le32(s, (UINT32)(val & 0xffffffff)); | put_le32(s, (UINT32)(val & 0xffffffff)); | ||||
| @@ -326,6 +339,30 @@ unsigned int get_be32(ByteIOContext *s) | |||||
| return val; | return val; | ||||
| } | } | ||||
| double get_native_double(ByteIOContext *s) | |||||
| { | |||||
| double val; | |||||
| get_buffer(s, (unsigned char *) &val, sizeof(val)); | |||||
| return val; | |||||
| } | |||||
| char *get_native_string(ByteIOContext *s, char *buf, int maxlen) | |||||
| { | |||||
| int i = 0; | |||||
| char c; | |||||
| while ((c = get_byte(s))) { | |||||
| if (i < maxlen-1) | |||||
| buf[i++] = c; | |||||
| } | |||||
| buf[i] = 0; /* Ensure null terminated, but may be truncated */ | |||||
| return buf; | |||||
| } | |||||
| UINT64 get_be64(ByteIOContext *s) | UINT64 get_be64(ByteIOContext *s) | ||||
| { | { | ||||
| UINT64 val; | UINT64 val; | ||||
| @@ -166,6 +166,15 @@ static int ffm_write_header(AVFormatContext *s) | |||||
| put_be16(pb, (int) (codec->qcompress * 10000.0)); | put_be16(pb, (int) (codec->qcompress * 10000.0)); | ||||
| put_be16(pb, (int) (codec->qblur * 10000.0)); | put_be16(pb, (int) (codec->qblur * 10000.0)); | ||||
| put_be32(pb, codec->bit_rate_tolerance); | put_be32(pb, codec->bit_rate_tolerance); | ||||
| put_native_string(pb, codec->rc_eq); | |||||
| put_be32(pb, codec->rc_max_rate); | |||||
| put_be32(pb, codec->rc_min_rate); | |||||
| put_be32(pb, codec->rc_buffer_size); | |||||
| put_native_double(pb, codec->i_quant_factor); | |||||
| put_native_double(pb, codec->b_quant_factor); | |||||
| put_native_double(pb, codec->i_quant_offset); | |||||
| put_native_double(pb, codec->b_quant_offset); | |||||
| put_be32(pb, codec->dct_algo); | |||||
| break; | break; | ||||
| case CODEC_TYPE_AUDIO: | case CODEC_TYPE_AUDIO: | ||||
| put_be32(pb, codec->sample_rate); | put_be32(pb, codec->sample_rate); | ||||
| @@ -380,6 +389,8 @@ static int ffm_read_header(AVFormatContext *s, AVFormatParameters *ap) | |||||
| get_be32(pb); /* total bitrate */ | get_be32(pb); /* total bitrate */ | ||||
| /* read each stream */ | /* read each stream */ | ||||
| for(i=0;i<s->nb_streams;i++) { | for(i=0;i<s->nb_streams;i++) { | ||||
| char rc_eq_buf[128]; | |||||
| st = av_mallocz(sizeof(AVStream)); | st = av_mallocz(sizeof(AVStream)); | ||||
| if (!st) | if (!st) | ||||
| goto fail; | goto fail; | ||||
| @@ -409,6 +420,15 @@ static int ffm_read_header(AVFormatContext *s, AVFormatParameters *ap) | |||||
| codec->qcompress = get_be16(pb) / 10000.0; | codec->qcompress = get_be16(pb) / 10000.0; | ||||
| codec->qblur = get_be16(pb) / 10000.0; | codec->qblur = get_be16(pb) / 10000.0; | ||||
| codec->bit_rate_tolerance = get_be32(pb); | codec->bit_rate_tolerance = get_be32(pb); | ||||
| codec->rc_eq = strdup(get_native_string(pb, rc_eq_buf, sizeof(rc_eq_buf))); | |||||
| codec->rc_max_rate = get_be32(pb); | |||||
| codec->rc_min_rate = get_be32(pb); | |||||
| codec->rc_buffer_size = get_be32(pb); | |||||
| codec->i_quant_factor = get_native_double(pb); | |||||
| codec->b_quant_factor = get_native_double(pb); | |||||
| codec->i_quant_offset = get_native_double(pb); | |||||
| codec->b_quant_offset = get_native_double(pb); | |||||
| codec->dct_algo = get_be32(pb); | |||||
| break; | break; | ||||
| case CODEC_TYPE_AUDIO: | case CODEC_TYPE_AUDIO: | ||||
| codec->sample_rate = get_be32(pb); | codec->sample_rate = get_be32(pb); | ||||
| @@ -416,7 +436,7 @@ static int ffm_read_header(AVFormatContext *s, AVFormatParameters *ap) | |||||
| codec->frame_size = get_le16(pb); | codec->frame_size = get_le16(pb); | ||||
| break; | break; | ||||
| default: | default: | ||||
| av_abort(); | |||||
| goto fail; | |||||
| } | } | ||||
| } | } | ||||