summaryrefslogtreecommitdiff
path: root/src/demuxers/demux_realaudio.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/demuxers/demux_realaudio.c')
-rw-r--r--src/demuxers/demux_realaudio.c102
1 files changed, 48 insertions, 54 deletions
diff --git a/src/demuxers/demux_realaudio.c b/src/demuxers/demux_realaudio.c
index 81d4da274..1040d42bc 100644
--- a/src/demuxers/demux_realaudio.c
+++ b/src/demuxers/demux_realaudio.c
@@ -64,7 +64,9 @@ typedef struct {
off_t data_start;
off_t data_size;
- int sps, cfs, w, h;
+ uint32_t cfs;
+ uint16_t w, h;
+ int frame_len;
int frame_size;
uint8_t *frame_buffer;
@@ -77,27 +79,22 @@ typedef struct {
} demux_ra_class_t;
/* Map flavour to bytes per second */
-static int sipr_fl2bps[4] = {813, 1062, 625, 2000}; // 6.5, 8.5, 5, 16 kbit per second
+static const int sipr_fl2bps[4] = {813, 1062, 625, 2000}; // 6.5, 8.5, 5, 16 kbit per second
/* returns 1 if the RealAudio file was opened successfully, 0 otherwise */
static int open_ra_file(demux_ra_t *this) {
- unsigned char file_header[RA_FILE_HEADER_PREV_SIZE], len;
- unsigned short version;
- off_t offset;
-
+ uint8_t file_header[RA_FILE_HEADER_PREV_SIZE];
/* check the signature */
if (_x_demux_read_header(this->input, file_header, RA_FILE_HEADER_PREV_SIZE) !=
RA_FILE_HEADER_PREV_SIZE)
return 0;
- if ((file_header[0] != '.') ||
- (file_header[1] != 'r') ||
- (file_header[2] != 'a'))
+ if ( memcmp(file_header, ".ra", 3) != 0 )
return 0;
/* read version */
- version = _X_BE_16(&file_header[0x04]);
+ const uint16_t version = _X_BE_16(&file_header[0x04]);
/* read header size according to version */
if (version == 3)
@@ -118,6 +115,7 @@ static int open_ra_file(demux_ra_t *this) {
return 0;
}
+ off_t offset;
/* read header data according to version */
if((version == 3) && (this->header_size >= 32)) {
this->data_size = _X_BE_32(&this->header[0x12]);
@@ -147,31 +145,37 @@ static int open_ra_file(demux_ra_t *this) {
}
/* Read title */
- len = this->header[offset];
- if(len && ((offset+len+2) < this->header_size)) {
- _x_meta_info_n_set(this->stream, XINE_META_INFO_TITLE,
- &this->header[offset+1], len);
- offset += len+1;
- } else
- offset++;
+ {
+ const uint8_t len = this->header[offset];
+ if(len && ((offset+len+2) < this->header_size)) {
+ _x_meta_info_n_set(this->stream, XINE_META_INFO_TITLE,
+ &this->header[offset+1], len);
+ offset += len+1;
+ } else
+ offset++;
+ }
/* Author */
- len = this->header[offset];
- if(len && ((offset+len+1) < this->header_size)) {
- _x_meta_info_n_set(this->stream, XINE_META_INFO_ARTIST,
- &this->header[offset+1], len);
- offset += len+1;
- } else
- offset++;
+ {
+ const uint8_t len = this->header[offset];
+ if(len && ((offset+len+1) < this->header_size)) {
+ _x_meta_info_n_set(this->stream, XINE_META_INFO_ARTIST,
+ &this->header[offset+1], len);
+ offset += len+1;
+ } else
+ offset++;
+ }
/* Copyright/Date */
- len = this->header[offset];
- if(len && ((offset+len) <= this->header_size)) {
- _x_meta_info_n_set(this->stream, XINE_META_INFO_YEAR,
- &this->header[offset+1], len);
- offset += len+1;
- } else
- offset++;
+ {
+ const uint8_t len = this->header[offset];
+ if(len && ((offset+len) <= this->header_size)) {
+ _x_meta_info_n_set(this->stream, XINE_META_INFO_YEAR,
+ &this->header[offset+1], len);
+ offset += len+1;
+ } else
+ offset++;
+ }
/* Fourcc for version 3 comes after meta info */
if(version == 3) {
@@ -193,17 +197,16 @@ static int open_ra_file(demux_ra_t *this) {
this->audio_type = _x_formattag_to_buf_audio(this->fourcc);
if (version == 4) {
- this->sps = _X_BE_16 (this->header+44);
+ const uint16_t sps = _X_BE_16 (this->header+44) ? : 1;
this->w = _X_BE_16 (this->header+42);
this->h = _X_BE_16 (this->header+40);
this->cfs = _X_BE_32 (this->header+24);
- if (this->sps) {
- this->frame_size = this->sps * this->h * this->sps;
- this->frame_buffer = xine_xmalloc (this->frame_size);
- } else {
- this->frame_size = this->w * this->h;
- this->frame_buffer = xine_xmalloc (this->frame_size);
- }
+
+ this->frame_len = this->w * this->h;
+ this->frame_size = this->frame_len * sps;
+
+ this->frame_buffer = calloc(this->frame_size, 1);
+ _x_assert(this->frame_buffer != NULL);
if (this->audio_type == BUF_AUDIO_28_8 || this->audio_type == BUF_AUDIO_SIPRO)
this->block_align = this->cfs;
@@ -227,7 +230,6 @@ static int demux_ra_send_chunk(demux_plugin_t *this_gen) {
demux_ra_t *this = (demux_ra_t *) this_gen;
off_t current_normpos = 0;
- int64_t current_pts;
/* just load data chunks from wherever the stream happens to be
* pointing; issue a DEMUX_FINISHED status if EOF is reached */
@@ -235,7 +237,7 @@ static int demux_ra_send_chunk(demux_plugin_t *this_gen) {
current_normpos = (int)( (double) (this->input->get_current_pos (this->input) - this->data_start) *
65535 / this->data_size );
- current_pts = 0; /* let the engine sort out the pts for now */
+ const int64_t current_pts = 0; /* let the engine sort out the pts for now */
if (this->seek_flag) {
_x_demux_control_newpts(this->stream, current_pts, BUF_FLAG_SEEK);
@@ -243,26 +245,21 @@ static int demux_ra_send_chunk(demux_plugin_t *this_gen) {
}
if (this->audio_type == BUF_AUDIO_28_8 || this->audio_type == BUF_AUDIO_SIPRO) {
- uint8_t * buffer;
-
- buffer = this->frame_buffer;
if (this->audio_type == BUF_AUDIO_SIPRO) {
- int len = this->h * this->w;
- if(this->input->read(this->input, this->frame_buffer, len) < len) {
+ if(this->input->read(this->input, this->frame_buffer, this->frame_len) < this->frame_len) {
xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG,
"demux_realaudio: failed to read audio chunk\n");
this->status = DEMUX_FINISHED;
return this->status;
}
- demux_real_sipro_swap (this->frame_buffer, len * 2 / 96);
+ demux_real_sipro_swap (this->frame_buffer, this->frame_len * 2 / 96);
} else {
int x, y;
- int pos;
for (y = 0; y < this->h; y++)
for (x = 0; x < this->h / 2; x++) {
- pos = x * 2 * this->w + y * this->cfs;
+ const int pos = x * 2 * this->w + y * this->cfs;
if(this->input->read(this->input, this->frame_buffer + pos,
this->cfs) < this->cfs) {
xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG,
@@ -275,7 +272,7 @@ static int demux_ra_send_chunk(demux_plugin_t *this_gen) {
}
_x_demux_send_data(this->audio_fifo,
- buffer, this->frame_size,
+ this->frame_buffer, this->frame_size,
current_pts, this->audio_type, 0,
current_normpos, current_pts / 90, 0, 0);
} else if(_x_demux_read_send_data(this->audio_fifo, this->input, this->block_align,
@@ -310,10 +307,7 @@ static void demux_ra_send_headers(demux_plugin_t *this_gen) {
buf->type = this->audio_type;
buf->decoder_flags = BUF_FLAG_HEADER|BUF_FLAG_FRAME_END;
- if(this->header_size > buf->max_size)
- buf->size = buf->max_size;
- else
- buf->size = this->header_size;
+ buf->size = MIN(this->header_size, buf->max_size);
memcpy(buf->content, this->header, buf->size);