diff options
author | 2002-10-22 15:41:41 +0000 | |
---|---|---|
committer | 2002-10-22 15:41:41 +0000 | |
commit | c88b1c67fba9074290bebd4f74c8a0d3ba964739 (patch) | |
tree | 02351ec29d62e0973023321cea3927af45ff3b31 | |
parent | 2508ca0ccdbdf8d5e55c4b4f1f9ed0b2549fdd7d (diff) |
endianess independency (using get int 16/32/64 func instead of typecasting pointer)
patch by Hampa Hug <hhug@student.ethz.ch>
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@7846 b3059339-0415-0410-9bf9-f77b7e298cf2
-rw-r--r-- | libmpdemux/demux_ogg.c | 99 |
1 files changed, 75 insertions, 24 deletions
diff --git a/libmpdemux/demux_ogg.c b/libmpdemux/demux_ogg.c index 5227647be2..c5e7c98208 100644 --- a/libmpdemux/demux_ogg.c +++ b/libmpdemux/demux_ogg.c @@ -5,6 +5,7 @@ #include <stdlib.h> #include <stdio.h> +#include <string.h> #include "../mp_msg.h" #include "../help_mp.h" @@ -119,6 +120,56 @@ static subtitle ogg_sub; extern subtitle* vo_sub; //FILE* subout; +static +uint16_t get_uint16 (const void *buf) +{ + uint16_t ret; + unsigned char *tmp; + + tmp = (unsigned char *) buf; + + ret = tmp[1] & 0xff; + ret = (ret << 8) + (tmp[0] & 0xff); + + return (ret); +} + +static +uint32_t get_uint32 (const void *buf) +{ + uint32_t ret; + unsigned char *tmp; + + tmp = (unsigned char *) buf; + + ret = tmp[3] & 0xff; + ret = (ret << 8) + (tmp[2] & 0xff); + ret = (ret << 8) + (tmp[1] & 0xff); + ret = (ret << 8) + (tmp[0] & 0xff); + + return (ret); +} + +static +uint64_t get_uint64 (const void *buf) +{ + uint64_t ret; + unsigned char *tmp; + + tmp = (unsigned char *) buf; + + ret = tmp[7] & 0xff; + ret = (ret << 8) + (tmp[6] & 0xff); + ret = (ret << 8) + (tmp[5] & 0xff); + ret = (ret << 8) + (tmp[4] & 0xff); + ret = (ret << 8) + (tmp[3] & 0xff); + ret = (ret << 8) + (tmp[2] & 0xff); + ret = (ret << 8) + (tmp[1] & 0xff); + ret = (ret << 8) + (tmp[0] & 0xff); + + return (ret); +} + void demux_ogg_init_sub () { int lcv; if(!ogg_sub.text[0]) // not yet allocated @@ -472,18 +523,18 @@ int demux_ogg_open(demuxer_t* demuxer) { } else if(pack.bytes >= 142 && ! strncmp(&pack.packet[1],"Direct Show Samples embedded in Ogg",35) ) { // Old video header - if(*(int32_t*)(pack.packet+96) == 0x05589f80 && pack.bytes >= 184) { + if(get_uint32 (pack.packet+96) == 0x05589f80 && pack.bytes >= 184) { sh_v = new_sh_video(demuxer,ogg_d->num_sub); sh_v->bih = (BITMAPINFOHEADER*)calloc(1,sizeof(BITMAPINFOHEADER)); sh_v->bih->biSize=sizeof(BITMAPINFOHEADER); sh_v->bih->biCompression= sh_v->format = mmioFOURCC(pack.packet[68],pack.packet[69], pack.packet[70],pack.packet[71]); - sh_v->frametime = (*(int64_t*)(pack.packet+164))*0.0000001; + sh_v->frametime = get_uint64(pack.packet+164)*0.0000001; sh_v->fps = 1/sh_v->frametime; - sh_v->disp_w = sh_v->bih->biWidth = *(int32_t*)(pack.packet+176); - sh_v->disp_h = sh_v->bih->biHeight = *(int32_t*)(pack.packet+180); - sh_v->bih->biBitCount = *(int16_t*)(pack.packet+182); + sh_v->disp_w = sh_v->bih->biWidth = get_uint32(pack.packet+176); + sh_v->disp_h = sh_v->bih->biHeight = get_uint32(pack.packet+180); + sh_v->bih->biBitCount = get_uint16(pack.packet+182); if(!sh_v->bih->biBitCount) sh_v->bih->biBitCount=24; // hack, FIXME sh_v->bih->biPlanes=1; sh_v->bih->biSizeImage=(sh_v->bih->biBitCount>>3)*sh_v->bih->biWidth*sh_v->bih->biHeight; @@ -493,17 +544,17 @@ int demux_ogg_open(demuxer_t* demuxer) { mp_msg(MSGT_DEMUX,MSGL_V,"OGG stream %d is video (old hdr)\n",ogg_d->num_sub); if(verbose) print_video_header(sh_v->bih); // Old audio header - } else if(*(int32_t*)pack.packet+96 == 0x05589F81) { + } else if(get_uint32(pack.packet+96) == 0x05589F81) { unsigned int extra_size; sh_a = new_sh_audio(demuxer,ogg_d->num_sub); - extra_size = *(int16_t*)(pack.packet+140); + extra_size = get_uint16(pack.packet+140); sh_a->wf = (WAVEFORMATEX*)calloc(1,sizeof(WAVEFORMATEX)+extra_size); - sh_a->format = sh_a->wf->wFormatTag = *(int16_t*)(pack.packet+124); - sh_a->channels = sh_a->wf->nChannels = *(int16_t*)(pack.packet+126); - sh_a->samplerate = sh_a->wf->nSamplesPerSec = *(int32_t*)(pack.packet+128); - sh_a->wf->nAvgBytesPerSec = *(int32_t*)(pack.packet+132); - sh_a->wf->nBlockAlign = *(int16_t*)(pack.packet+136); - sh_a->wf->wBitsPerSample = *(int16_t*)(pack.packet+138); + sh_a->format = sh_a->wf->wFormatTag = get_uint16(pack.packet+124); + sh_a->channels = sh_a->wf->nChannels = get_uint16(pack.packet+126); + sh_a->samplerate = sh_a->wf->nSamplesPerSec = get_uint32(pack.packet+128); + sh_a->wf->nAvgBytesPerSec = get_uint32(pack.packet+132); + sh_a->wf->nBlockAlign = get_uint16(pack.packet+136); + sh_a->wf->wBitsPerSample = get_uint16(pack.packet+138); sh_a->samplesize = (sh_a->wf->wBitsPerSample+7)/8; sh_a->wf->cbSize = extra_size; if(extra_size > 0) @@ -528,11 +579,11 @@ int demux_ogg_open(demuxer_t* demuxer) { sh_v->bih->biCompression= sh_v->format = mmioFOURCC(st->subtype[0],st->subtype[1], st->subtype[2],st->subtype[3]); - sh_v->frametime = st->time_unit*0.0000001; - sh_v->fps = 1/sh_v->frametime; - sh_v->bih->biBitCount = st->bits_per_sample; - sh_v->disp_w = sh_v->bih->biWidth = st->sh.video.width; - sh_v->disp_h = sh_v->bih->biHeight = st->sh.video.height; + sh_v->frametime = get_uint64(&st->time_unit)*0.0000001; + sh_v->fps = 1.0/sh_v->frametime; + sh_v->bih->biBitCount = get_uint16(&st->bits_per_sample); + sh_v->disp_w = sh_v->bih->biWidth = get_uint32(&st->sh.video.width); + sh_v->disp_h = sh_v->bih->biHeight = get_uint32(&st->sh.video.height); if(!sh_v->bih->biBitCount) sh_v->bih->biBitCount=24; // hack, FIXME sh_v->bih->biPlanes=1; sh_v->bih->biSizeImage=(sh_v->bih->biBitCount>>3)*sh_v->bih->biWidth*sh_v->bih->biHeight; @@ -544,17 +595,17 @@ int demux_ogg_open(demuxer_t* demuxer) { /// New audio header } else if(strncmp(st->streamtype,"audio",5) == 0) { char buffer[5]; - unsigned int extra_size = st->size - sizeof(stream_header); + unsigned int extra_size = get_uint32 (&st->size) - sizeof(stream_header); memcpy(buffer,st->subtype,4); buffer[4] = '\0'; sh_a = new_sh_audio(demuxer,ogg_d->num_sub); sh_a->wf = (WAVEFORMATEX*)calloc(1,sizeof(WAVEFORMATEX)+extra_size); sh_a->format = sh_a->wf->wFormatTag = strtol(buffer, NULL, 16); - sh_a->channels = sh_a->wf->nChannels = st->sh.audio.channels; - sh_a->samplerate = sh_a->wf->nSamplesPerSec = st->samples_per_unit; - sh_a->wf->nAvgBytesPerSec = st->sh.audio.avgbytespersec; - sh_a->wf->nBlockAlign = st->sh.audio.blockalign; - sh_a->wf->wBitsPerSample = st->bits_per_sample; + sh_a->channels = sh_a->wf->nChannels = get_uint16(&st->sh.audio.channels); + sh_a->samplerate = sh_a->wf->nSamplesPerSec = get_uint64(&st->samples_per_unit); + sh_a->wf->nAvgBytesPerSec = get_uint32(&st->sh.audio.avgbytespersec); + sh_a->wf->nBlockAlign = get_uint16(&st->sh.audio.blockalign); + sh_a->wf->wBitsPerSample = get_uint16(&st->bits_per_sample); sh_a->samplesize = (sh_a->wf->wBitsPerSample+7)/8; sh_a->wf->cbSize = extra_size; if(extra_size) |