Mercurial > libavcodec.hg
comparison dv.c @ 1064:b32afefe7d33 libavcodec
* UINTX -> uintx_t INTX -> intx_t
| author | kabi |
|---|---|
| date | Tue, 11 Feb 2003 16:35:48 +0000 |
| parents | c7922c5becf6 |
| children | 6da5ae9ee199 |
comparison
equal
deleted
inserted
replaced
| 1063:fdeac9642346 | 1064:b32afefe7d33 |
|---|---|
| 30 AVCodecContext *avctx; | 30 AVCodecContext *avctx; |
| 31 GetBitContext gb; | 31 GetBitContext gb; |
| 32 VLC *vlc; | 32 VLC *vlc; |
| 33 int sampling_411; /* 0 = 420, 1 = 411 */ | 33 int sampling_411; /* 0 = 420, 1 = 411 */ |
| 34 int width, height; | 34 int width, height; |
| 35 UINT8 *current_picture[3]; /* picture structure */ | 35 uint8_t *current_picture[3]; /* picture structure */ |
| 36 AVFrame picture; | 36 AVFrame picture; |
| 37 int linesize[3]; | 37 int linesize[3]; |
| 38 DCTELEM block[5*6][64] __align8; | 38 DCTELEM block[5*6][64] __align8; |
| 39 UINT8 dv_zigzag[2][64]; | 39 uint8_t dv_zigzag[2][64]; |
| 40 UINT8 idct_permutation[64]; | 40 uint8_t idct_permutation[64]; |
| 41 /* XXX: move it to static storage ? */ | 41 /* XXX: move it to static storage ? */ |
| 42 UINT8 dv_shift[2][22][64]; | 42 uint8_t dv_shift[2][22][64]; |
| 43 void (*idct_put[2])(UINT8 *dest, int line_size, DCTELEM *block); | 43 void (*idct_put[2])(uint8_t *dest, int line_size, DCTELEM *block); |
| 44 } DVVideoDecodeContext; | 44 } DVVideoDecodeContext; |
| 45 | 45 |
| 46 #include "dvdata.h" | 46 #include "dvdata.h" |
| 47 | 47 |
| 48 static VLC dv_vlc; | 48 static VLC dv_vlc; |
| 134 } | 134 } |
| 135 | 135 |
| 136 //#define VLC_DEBUG | 136 //#define VLC_DEBUG |
| 137 | 137 |
| 138 typedef struct BlockInfo { | 138 typedef struct BlockInfo { |
| 139 const UINT8 *shift_table; | 139 const uint8_t *shift_table; |
| 140 const UINT8 *scan_table; | 140 const uint8_t *scan_table; |
| 141 UINT8 pos; /* position in block */ | 141 uint8_t pos; /* position in block */ |
| 142 UINT8 eob_reached; /* true if EOB has been reached */ | 142 uint8_t eob_reached; /* true if EOB has been reached */ |
| 143 UINT8 dct_mode; | 143 uint8_t dct_mode; |
| 144 UINT8 partial_bit_count; | 144 uint8_t partial_bit_count; |
| 145 UINT16 partial_bit_buffer; | 145 uint16_t partial_bit_buffer; |
| 146 int shift_offset; | 146 int shift_offset; |
| 147 } BlockInfo; | 147 } BlockInfo; |
| 148 | 148 |
| 149 /* block size in bits */ | 149 /* block size in bits */ |
| 150 static const UINT16 block_sizes[6] = { | 150 static const uint16_t block_sizes[6] = { |
| 151 112, 112, 112, 112, 80, 80 | 151 112, 112, 112, 112, 80, 80 |
| 152 }; | 152 }; |
| 153 | 153 |
| 154 #ifndef ALT_BITSTREAM_READER | 154 #ifndef ALT_BITSTREAM_READER |
| 155 #error only works with ALT_BITSTREAM_READER | 155 #error only works with ALT_BITSTREAM_READER |
| 159 static void dv_decode_ac(DVVideoDecodeContext *s, | 159 static void dv_decode_ac(DVVideoDecodeContext *s, |
| 160 BlockInfo *mb, DCTELEM *block, int last_index) | 160 BlockInfo *mb, DCTELEM *block, int last_index) |
| 161 { | 161 { |
| 162 int last_re_index; | 162 int last_re_index; |
| 163 int shift_offset = mb->shift_offset; | 163 int shift_offset = mb->shift_offset; |
| 164 const UINT8 *scan_table = mb->scan_table; | 164 const uint8_t *scan_table = mb->scan_table; |
| 165 const UINT8 *shift_table = mb->shift_table; | 165 const uint8_t *shift_table = mb->shift_table; |
| 166 int pos = mb->pos; | 166 int pos = mb->pos; |
| 167 int level, pos1, sign, run; | 167 int level, pos1, sign, run; |
| 168 int partial_bit_count; | 168 int partial_bit_count; |
| 169 | 169 |
| 170 OPEN_READER(re, &s->gb); | 170 OPEN_READER(re, &s->gb); |
| 174 #endif | 174 #endif |
| 175 | 175 |
| 176 /* if we must parse a partial vlc, we do it here */ | 176 /* if we must parse a partial vlc, we do it here */ |
| 177 partial_bit_count = mb->partial_bit_count; | 177 partial_bit_count = mb->partial_bit_count; |
| 178 if (partial_bit_count > 0) { | 178 if (partial_bit_count > 0) { |
| 179 UINT8 buf[4]; | 179 uint8_t buf[4]; |
| 180 UINT32 v; | 180 uint32_t v; |
| 181 int l, l1; | 181 int l, l1; |
| 182 GetBitContext gb1; | 182 GetBitContext gb1; |
| 183 | 183 |
| 184 /* build the dummy bit buffer */ | 184 /* build the dummy bit buffer */ |
| 185 l = 16 - partial_bit_count; | 185 l = 16 - partial_bit_count; |
| 296 } | 296 } |
| 297 } | 297 } |
| 298 | 298 |
| 299 /* mb_x and mb_y are in units of 8 pixels */ | 299 /* mb_x and mb_y are in units of 8 pixels */ |
| 300 static inline void dv_decode_video_segment(DVVideoDecodeContext *s, | 300 static inline void dv_decode_video_segment(DVVideoDecodeContext *s, |
| 301 UINT8 *buf_ptr1, | 301 uint8_t *buf_ptr1, |
| 302 const UINT16 *mb_pos_ptr) | 302 const uint16_t *mb_pos_ptr) |
| 303 { | 303 { |
| 304 int quant, dc, dct_mode, class1, j; | 304 int quant, dc, dct_mode, class1, j; |
| 305 int mb_index, mb_x, mb_y, v, last_index; | 305 int mb_index, mb_x, mb_y, v, last_index; |
| 306 DCTELEM *block, *block1; | 306 DCTELEM *block, *block1; |
| 307 int c_offset, bits_left; | 307 int c_offset, bits_left; |
| 308 UINT8 *y_ptr; | 308 uint8_t *y_ptr; |
| 309 BlockInfo mb_data[5 * 6], *mb, *mb1; | 309 BlockInfo mb_data[5 * 6], *mb, *mb1; |
| 310 void (*idct_put)(UINT8 *dest, int line_size, DCTELEM *block); | 310 void (*idct_put)(uint8_t *dest, int line_size, DCTELEM *block); |
| 311 UINT8 *buf_ptr; | 311 uint8_t *buf_ptr; |
| 312 PutBitContext pb, vs_pb; | 312 PutBitContext pb, vs_pb; |
| 313 UINT8 mb_bit_buffer[80 + 4]; /* allow some slack */ | 313 uint8_t mb_bit_buffer[80 + 4]; /* allow some slack */ |
| 314 int mb_bit_count; | 314 int mb_bit_count; |
| 315 UINT8 vs_bit_buffer[5 * 80 + 4]; /* allow some slack */ | 315 uint8_t vs_bit_buffer[5 * 80 + 4]; /* allow some slack */ |
| 316 int vs_bit_count; | 316 int vs_bit_count; |
| 317 | 317 |
| 318 memset(s->block, 0, sizeof(s->block)); | 318 memset(s->block, 0, sizeof(s->block)); |
| 319 | 319 |
| 320 /* pass 1 : read DC and AC coefficients in blocks */ | 320 /* pass 1 : read DC and AC coefficients in blocks */ |
| 491 | 491 |
| 492 /* NOTE: exactly one frame must be given (120000 bytes for NTSC, | 492 /* NOTE: exactly one frame must be given (120000 bytes for NTSC, |
| 493 144000 bytes for PAL) */ | 493 144000 bytes for PAL) */ |
| 494 static int dvvideo_decode_frame(AVCodecContext *avctx, | 494 static int dvvideo_decode_frame(AVCodecContext *avctx, |
| 495 void *data, int *data_size, | 495 void *data, int *data_size, |
| 496 UINT8 *buf, int buf_size) | 496 uint8_t *buf, int buf_size) |
| 497 { | 497 { |
| 498 DVVideoDecodeContext *s = avctx->priv_data; | 498 DVVideoDecodeContext *s = avctx->priv_data; |
| 499 int sct, dsf, apt, ds, nb_dif_segs, vs, width, height, i, packet_size; | 499 int sct, dsf, apt, ds, nb_dif_segs, vs, width, height, i, packet_size; |
| 500 UINT8 *buf_ptr; | 500 uint8_t *buf_ptr; |
| 501 const UINT16 *mb_pos_ptr; | 501 const uint16_t *mb_pos_ptr; |
| 502 | 502 |
| 503 /* parse id */ | 503 /* parse id */ |
| 504 init_get_bits(&s->gb, buf, buf_size*8); | 504 init_get_bits(&s->gb, buf, buf_size*8); |
| 505 sct = get_bits(&s->gb, 3); | 505 sct = get_bits(&s->gb, 3); |
| 506 if (sct != 0) | 506 if (sct != 0) |
| 640 { | 640 { |
| 641 // DVAudioDecodeContext *s = avctx->priv_data; | 641 // DVAudioDecodeContext *s = avctx->priv_data; |
| 642 return 0; | 642 return 0; |
| 643 } | 643 } |
| 644 | 644 |
| 645 static UINT16 dv_audio_12to16(UINT16 sample) | 645 static uint16_t dv_audio_12to16(uint16_t sample) |
| 646 { | 646 { |
| 647 UINT16 shift, result; | 647 uint16_t shift, result; |
| 648 | 648 |
| 649 sample = (sample < 0x800) ? sample : sample | 0xf000; | 649 sample = (sample < 0x800) ? sample : sample | 0xf000; |
| 650 shift = (sample & 0xf00) >> 8; | 650 shift = (sample & 0xf00) >> 8; |
| 651 | 651 |
| 652 if (shift < 0x2 || shift > 0xd) { | 652 if (shift < 0x2 || shift > 0xd) { |
| 674 4. Audio is always returned as 16bit linear samples: 12bit | 674 4. Audio is always returned as 16bit linear samples: 12bit |
| 675 nonlinear samples are converted into 16bit linear ones. | 675 nonlinear samples are converted into 16bit linear ones. |
| 676 */ | 676 */ |
| 677 static int dvaudio_decode_frame(AVCodecContext *avctx, | 677 static int dvaudio_decode_frame(AVCodecContext *avctx, |
| 678 void *data, int *data_size, | 678 void *data, int *data_size, |
| 679 UINT8 *buf, int buf_size) | 679 uint8_t *buf, int buf_size) |
| 680 { | 680 { |
| 681 DVVideoDecodeContext *s = avctx->priv_data; | 681 DVVideoDecodeContext *s = avctx->priv_data; |
| 682 const UINT16 (*unshuffle)[9]; | 682 const uint16_t (*unshuffle)[9]; |
| 683 int smpls, freq, quant, sys, stride, difseg, ad, dp, nb_dif_segs, i; | 683 int smpls, freq, quant, sys, stride, difseg, ad, dp, nb_dif_segs, i; |
| 684 UINT16 lc, rc; | 684 uint16_t lc, rc; |
| 685 UINT8 *buf_ptr; | 685 uint8_t *buf_ptr; |
| 686 | 686 |
| 687 /* parse id */ | 687 /* parse id */ |
| 688 init_get_bits(&s->gb, &buf[AAUX_OFFSET], 5*8); | 688 init_get_bits(&s->gb, &buf[AAUX_OFFSET], 5*8); |
| 689 i = get_bits(&s->gb, 8); | 689 i = get_bits(&s->gb, 8); |
| 690 if (i != 0x50) { /* No audio ? */ | 690 if (i != 0x50) { /* No audio ? */ |
| 740 ((short *)data)[i] = (buf_ptr[dp] << 8) | buf_ptr[dp+1]; | 740 ((short *)data)[i] = (buf_ptr[dp] << 8) | buf_ptr[dp+1]; |
| 741 } else { /* 12bit quantization */ | 741 } else { /* 12bit quantization */ |
| 742 if (difseg >= nb_dif_segs/2) | 742 if (difseg >= nb_dif_segs/2) |
| 743 goto out; /* We're not doing 4ch at this time */ | 743 goto out; /* We're not doing 4ch at this time */ |
| 744 | 744 |
| 745 lc = ((UINT16)buf_ptr[dp] << 4) | | 745 lc = ((uint16_t)buf_ptr[dp] << 4) | |
| 746 ((UINT16)buf_ptr[dp+2] >> 4); | 746 ((uint16_t)buf_ptr[dp+2] >> 4); |
| 747 rc = ((UINT16)buf_ptr[dp+1] << 4) | | 747 rc = ((uint16_t)buf_ptr[dp+1] << 4) | |
| 748 ((UINT16)buf_ptr[dp+2] & 0x0f); | 748 ((uint16_t)buf_ptr[dp+2] & 0x0f); |
| 749 lc = dv_audio_12to16(lc); | 749 lc = dv_audio_12to16(lc); |
| 750 rc = dv_audio_12to16(rc); | 750 rc = dv_audio_12to16(rc); |
| 751 | 751 |
| 752 i = unshuffle[difseg][ad] + (dp - 8)/3 * stride; | 752 i = unshuffle[difseg][ad] + (dp - 8)/3 * stride; |
| 753 ((short *)data)[i] = lc; | 753 ((short *)data)[i] = lc; |
