summaryrefslogtreecommitdiff
path: root/libavcodec/cook.c
diff options
context:
space:
mode:
Diffstat (limited to 'libavcodec/cook.c')
-rw-r--r--libavcodec/cook.c53
1 files changed, 19 insertions, 34 deletions
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;
}