diff --git a/libavcodec/cook.c b/libavcodec/cook.c index 75752abda3..8fe17bd66f 100644 --- a/libavcodec/cook.c +++ b/libavcodec/cook.c @@ -51,6 +51,7 @@ #include "bitstream.h" #include "dsputil.h" #include "common.h" +#include "bytestream.h" #include "cookdata.h" @@ -69,19 +70,6 @@ typedef struct { int qidx_table2[8]; } COOKgain; -typedef struct __attribute__((__packed__)){ - /* codec data start */ - uint32_t cookversion; //in network order, bigendian - uint16_t samples_per_frame; //amount of samples per frame per channel, bigendian - uint16_t subbands; //amount of bands used in the frequency domain, bigendian - /* Mono extradata ends here. */ - uint32_t unused; - uint16_t js_subband_start; //bigendian - uint16_t js_vlc_bits; //bigendian - /* Stereo extradata ends here. */ -} COOKextradata; - - typedef struct { GetBitContext gb; /* stream data */ @@ -98,6 +86,7 @@ typedef struct { int total_subbands; int num_vectors; int bits_per_subpacket; + int cookversion; /* states */ int random_state; @@ -1083,15 +1072,15 @@ static int cook_decode_frame(AVCodecContext *avctx, } #ifdef COOKDEBUG -static void dump_cook_context(COOKContext *q, COOKextradata *e) +static void dump_cook_context(COOKContext *q) { //int i=0; #define PRINT(a,b) av_log(NULL,AV_LOG_ERROR," %s = %d\n", a, b); av_log(NULL,AV_LOG_ERROR,"COOKextradata\n"); - av_log(NULL,AV_LOG_ERROR,"cookversion=%x\n",e->cookversion); - if (e->cookversion > STEREO) { - PRINT("js_subband_start",e->js_subband_start); - PRINT("js_vlc_bits",e->js_vlc_bits); + av_log(NULL,AV_LOG_ERROR,"cookversion=%x\n",q->cookversion); + if (q->cookversion > STEREO) { + PRINT("js_subband_start",q->js_subband_start); + PRINT("js_vlc_bits",q->js_vlc_bits); } av_log(NULL,AV_LOG_ERROR,"COOKContext\n"); PRINT("nb_channels",q->nb_channels); @@ -1117,8 +1106,8 @@ static void dump_cook_context(COOKContext *q, COOKextradata *e) static int cook_decode_init(AVCodecContext *avctx) { - COOKextradata *e = (COOKextradata *)avctx->extradata; COOKContext *q = avctx->priv_data; + uint8_t *edata_ptr = avctx->extradata; /* Take care of the codec specific extradata. */ if (avctx->extradata_size <= 0) { @@ -1129,13 +1118,14 @@ static int cook_decode_init(AVCodecContext *avctx) Swap to right endianness so we don't need to care later on. */ av_log(avctx,AV_LOG_DEBUG,"codecdata_length=%d\n",avctx->extradata_size); if (avctx->extradata_size >= 8){ - e->cookversion = be2me_32(e->cookversion); - e->samples_per_frame = be2me_16(e->samples_per_frame); - e->subbands = be2me_16(e->subbands); + q->cookversion = be2me_32(bytestream_get_le32(&edata_ptr)); + q->samples_per_frame = be2me_16(bytestream_get_le16(&edata_ptr)); + q->subbands = be2me_16(bytestream_get_le16(&edata_ptr)); } if (avctx->extradata_size >= 16){ - e->js_subband_start = be2me_16(e->js_subband_start); - e->js_vlc_bits = be2me_16(e->js_vlc_bits); + bytestream_get_le32(&edata_ptr); //Unknown unused + q->js_subband_start = be2me_16(bytestream_get_le16(&edata_ptr)); + q->js_vlc_bits = be2me_16(bytestream_get_le16(&edata_ptr)); } } @@ -1148,20 +1138,17 @@ static int cook_decode_init(AVCodecContext *avctx) q->random_state = 1; /* Initialize extradata related variables. */ - q->samples_per_channel = e->samples_per_frame / q->nb_channels; - q->samples_per_frame = e->samples_per_frame; - q->subbands = e->subbands; + q->samples_per_channel = q->samples_per_frame / q->nb_channels; q->bits_per_subpacket = avctx->block_align * 8; /* Initialize default data states. */ - q->js_subband_start = 0; q->log2_numvector_size = 5; q->total_subbands = q->subbands; /* Initialize version-dependent variables */ - av_log(NULL,AV_LOG_DEBUG,"e->cookversion=%x\n",e->cookversion); + av_log(NULL,AV_LOG_DEBUG,"q->cookversion=%x\n",q->cookversion); q->joint_stereo = 0; - switch (e->cookversion) { + switch (q->cookversion) { case MONO: if (q->nb_channels != 1) { av_log(avctx,AV_LOG_ERROR,"Container channels != 1, report sample!\n"); @@ -1182,10 +1169,8 @@ static int cook_decode_init(AVCodecContext *avctx) } av_log(avctx,AV_LOG_DEBUG,"JOINT_STEREO\n"); if (avctx->extradata_size >= 16){ - q->total_subbands = q->subbands + e->js_subband_start; - q->js_subband_start = e->js_subband_start; + q->total_subbands = q->subbands + q->js_subband_start; q->joint_stereo = 1; - q->js_vlc_bits = e->js_vlc_bits; } if (q->samples_per_channel > 256) { q->log2_numvector_size = 6; @@ -1262,7 +1247,7 @@ static int cook_decode_init(AVCodecContext *avctx) } #ifdef COOKDEBUG - dump_cook_context(q,e); + dump_cook_context(q); #endif return 0; }