asvdec.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2003 Michael Niedermayer
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 /**
22  * @file
23  * ASUS V1/V2 decoder.
24  */
25 
26 #include "libavutil/attributes.h"
27 #include "libavutil/mem.h"
28 
29 #include "asv.h"
30 #include "avcodec.h"
31 #include "put_bits.h"
32 #include "internal.h"
33 #include "mathops.h"
34 #include "mpeg12data.h"
35 
36 #define VLC_BITS 6
37 #define ASV2_LEVEL_VLC_BITS 10
38 
39 static VLC ccp_vlc;
40 static VLC level_vlc;
41 static VLC dc_ccp_vlc;
42 static VLC ac_ccp_vlc;
44 
46 {
47  static int done = 0;
48 
49  if (!done) {
50  done = 1;
51 
52  INIT_VLC_STATIC(&ccp_vlc, VLC_BITS, 17,
53  &ff_asv_ccp_tab[0][1], 2, 1,
54  &ff_asv_ccp_tab[0][0], 2, 1, 64);
55  INIT_VLC_STATIC(&dc_ccp_vlc, VLC_BITS, 8,
56  &ff_asv_dc_ccp_tab[0][1], 2, 1,
57  &ff_asv_dc_ccp_tab[0][0], 2, 1, 64);
58  INIT_VLC_STATIC(&ac_ccp_vlc, VLC_BITS, 16,
59  &ff_asv_ac_ccp_tab[0][1], 2, 1,
60  &ff_asv_ac_ccp_tab[0][0], 2, 1, 64);
61  INIT_VLC_STATIC(&level_vlc, VLC_BITS, 7,
62  &ff_asv_level_tab[0][1], 2, 1,
63  &ff_asv_level_tab[0][0], 2, 1, 64);
64  INIT_VLC_STATIC(&asv2_level_vlc, ASV2_LEVEL_VLC_BITS, 63,
65  &ff_asv2_level_tab[0][1], 2, 1,
66  &ff_asv2_level_tab[0][0], 2, 1, 1024);
67  }
68 }
69 
70 //FIXME write a reversed bitstream reader to avoid the double reverse
71 static inline int asv2_get_bits(GetBitContext *gb, int n)
72 {
73  return ff_reverse[get_bits(gb, n) << (8-n)];
74 }
75 
76 static inline int asv1_get_level(GetBitContext *gb)
77 {
78  int code = get_vlc2(gb, level_vlc.table, VLC_BITS, 1);
79 
80  if (code == 3)
81  return get_sbits(gb, 8);
82  else
83  return code - 3;
84 }
85 
86 static inline int asv2_get_level(GetBitContext *gb)
87 {
88  int code = get_vlc2(gb, asv2_level_vlc.table, ASV2_LEVEL_VLC_BITS, 1);
89 
90  if (code == 31)
91  return (int8_t)asv2_get_bits(gb, 8);
92  else
93  return code - 31;
94 }
95 
96 static inline int asv1_decode_block(ASV1Context *a, int16_t block[64])
97 {
98  int i;
99 
100  block[0] = 8 * get_bits(&a->gb, 8);
101 
102  for (i = 0; i < 11; i++) {
103  const int ccp = get_vlc2(&a->gb, ccp_vlc.table, VLC_BITS, 1);
104 
105  if (ccp) {
106  if (ccp == 16)
107  break;
108  if (ccp < 0 || i >= 10) {
109  av_log(a->avctx, AV_LOG_ERROR, "coded coeff pattern damaged\n");
110  return AVERROR_INVALIDDATA;
111  }
112 
113  if (ccp & 8)
114  block[a->scantable.permutated[4 * i + 0]] = (asv1_get_level(&a->gb) * a->intra_matrix[4 * i + 0]) >> 4;
115  if (ccp & 4)
116  block[a->scantable.permutated[4 * i + 1]] = (asv1_get_level(&a->gb) * a->intra_matrix[4 * i + 1]) >> 4;
117  if (ccp & 2)
118  block[a->scantable.permutated[4 * i + 2]] = (asv1_get_level(&a->gb) * a->intra_matrix[4 * i + 2]) >> 4;
119  if (ccp & 1)
120  block[a->scantable.permutated[4 * i + 3]] = (asv1_get_level(&a->gb) * a->intra_matrix[4 * i + 3]) >> 4;
121  }
122  }
123 
124  return 0;
125 }
126 
127 static inline int asv2_decode_block(ASV1Context *a, int16_t block[64])
128 {
129  int i, count, ccp;
130 
131  count = asv2_get_bits(&a->gb, 4);
132 
133  block[0] = 8 * asv2_get_bits(&a->gb, 8);
134 
135  ccp = get_vlc2(&a->gb, dc_ccp_vlc.table, VLC_BITS, 1);
136  if (ccp) {
137  if (ccp & 4)
138  block[a->scantable.permutated[1]] = (asv2_get_level(&a->gb) * a->intra_matrix[1]) >> 4;
139  if (ccp & 2)
140  block[a->scantable.permutated[2]] = (asv2_get_level(&a->gb) * a->intra_matrix[2]) >> 4;
141  if (ccp & 1)
142  block[a->scantable.permutated[3]] = (asv2_get_level(&a->gb) * a->intra_matrix[3]) >> 4;
143  }
144 
145  for (i = 1; i < count + 1; i++) {
146  const int ccp = get_vlc2(&a->gb, ac_ccp_vlc.table, VLC_BITS, 1);
147 
148  if (ccp) {
149  if (ccp & 8)
150  block[a->scantable.permutated[4*i + 0]] = (asv2_get_level(&a->gb) * a->intra_matrix[4*i + 0]) >> 4;
151  if (ccp & 4)
152  block[a->scantable.permutated[4*i + 1]] = (asv2_get_level(&a->gb) * a->intra_matrix[4*i + 1]) >> 4;
153  if (ccp & 2)
154  block[a->scantable.permutated[4*i + 2]] = (asv2_get_level(&a->gb) * a->intra_matrix[4*i + 2]) >> 4;
155  if (ccp & 1)
156  block[a->scantable.permutated[4*i + 3]] = (asv2_get_level(&a->gb) * a->intra_matrix[4*i + 3]) >> 4;
157  }
158  }
159 
160  return 0;
161 }
162 
163 static inline int decode_mb(ASV1Context *a, int16_t block[6][64])
164 {
165  int i;
166 
167  a->dsp.clear_blocks(block[0]);
168 
169  if (a->avctx->codec_id == AV_CODEC_ID_ASV1) {
170  for (i = 0; i < 6; i++) {
171  if (asv1_decode_block(a, block[i]) < 0)
172  return -1;
173  }
174  } else {
175  for (i = 0; i < 6; i++) {
176  if (asv2_decode_block(a, block[i]) < 0)
177  return -1;
178  }
179  }
180  return 0;
181 }
182 
183 static inline void idct_put(ASV1Context *a, AVFrame *frame, int mb_x, int mb_y)
184 {
185  int16_t (*block)[64] = a->block;
186  int linesize = frame->linesize[0];
187 
188  uint8_t *dest_y = frame->data[0] + (mb_y * 16* linesize ) + mb_x * 16;
189  uint8_t *dest_cb = frame->data[1] + (mb_y * 8 * frame->linesize[1]) + mb_x * 8;
190  uint8_t *dest_cr = frame->data[2] + (mb_y * 8 * frame->linesize[2]) + mb_x * 8;
191 
192  a->dsp.idct_put(dest_y , linesize, block[0]);
193  a->dsp.idct_put(dest_y + 8, linesize, block[1]);
194  a->dsp.idct_put(dest_y + 8*linesize , linesize, block[2]);
195  a->dsp.idct_put(dest_y + 8*linesize + 8, linesize, block[3]);
196 
197  if (!(a->avctx->flags&CODEC_FLAG_GRAY)) {
198  a->dsp.idct_put(dest_cb, frame->linesize[1], block[4]);
199  a->dsp.idct_put(dest_cr, frame->linesize[2], block[5]);
200  }
201 }
202 
203 static int decode_frame(AVCodecContext *avctx,
204  void *data, int *got_frame,
205  AVPacket *avpkt)
206 {
207  ASV1Context * const a = avctx->priv_data;
208  const uint8_t *buf = avpkt->data;
209  int buf_size = avpkt->size;
210  AVFrame * const p = data;
211  int mb_x, mb_y, ret;
212 
213  if ((ret = ff_get_buffer(avctx, p, 0)) < 0)
214  return ret;
216  p->key_frame = 1;
217 
219  buf_size);
220  if (!a->bitstream_buffer)
221  return AVERROR(ENOMEM);
222 
223  if (avctx->codec_id == AV_CODEC_ID_ASV1)
224  a->dsp.bswap_buf((uint32_t*)a->bitstream_buffer, (const uint32_t*)buf, buf_size/4);
225  else {
226  int i;
227  for (i = 0; i < buf_size; i++)
228  a->bitstream_buffer[i] = ff_reverse[buf[i]];
229  }
230 
231  init_get_bits(&a->gb, a->bitstream_buffer, buf_size*8);
232 
233  for (mb_y = 0; mb_y < a->mb_height2; mb_y++) {
234  for (mb_x = 0; mb_x < a->mb_width2; mb_x++) {
235  if ((ret = decode_mb(a, a->block)) < 0)
236  return ret;
237 
238  idct_put(a, p, mb_x, mb_y);
239  }
240  }
241 
242  if (a->mb_width2 != a->mb_width) {
243  mb_x = a->mb_width2;
244  for (mb_y = 0; mb_y < a->mb_height2; mb_y++) {
245  if ((ret = decode_mb(a, a->block)) < 0)
246  return ret;
247 
248  idct_put(a, p, mb_x, mb_y);
249  }
250  }
251 
252  if (a->mb_height2 != a->mb_height) {
253  mb_y = a->mb_height2;
254  for (mb_x = 0; mb_x < a->mb_width; mb_x++) {
255  if ((ret = decode_mb(a, a->block)) < 0)
256  return ret;
257 
258  idct_put(a, p, mb_x, mb_y);
259  }
260  }
261 
262  *got_frame = 1;
263 
264  emms_c();
265 
266  return (get_bits_count(&a->gb) + 31) / 32 * 4;
267 }
268 
270 {
271  ASV1Context * const a = avctx->priv_data;
272  const int scale = avctx->codec_id == AV_CODEC_ID_ASV1 ? 1 : 2;
273  int i;
274 
275  ff_asv_common_init(avctx);
276  init_vlcs(a);
278  avctx->pix_fmt = AV_PIX_FMT_YUV420P;
279 
280  if (avctx->extradata_size < 1 || (a->inv_qscale = avctx->extradata[0]) == 0) {
281  av_log(avctx, AV_LOG_ERROR, "illegal qscale 0\n");
282  if (avctx->codec_id == AV_CODEC_ID_ASV1)
283  a->inv_qscale = 6;
284  else
285  a->inv_qscale = 10;
286  }
287 
288  for (i = 0; i < 64; i++) {
289  int index = ff_asv_scantab[i];
290 
292  }
293 
294  return 0;
295 }
296 
298 {
299  ASV1Context * const a = avctx->priv_data;
300 
302  a->bitstream_buffer_size = 0;
303 
304  return 0;
305 }
306 
307 #if CONFIG_ASV1_DECODER
308 AVCodec ff_asv1_decoder = {
309  .name = "asv1",
310  .type = AVMEDIA_TYPE_VIDEO,
311  .id = AV_CODEC_ID_ASV1,
312  .priv_data_size = sizeof(ASV1Context),
313  .init = decode_init,
314  .close = decode_end,
315  .decode = decode_frame,
316  .capabilities = CODEC_CAP_DR1,
317  .long_name = NULL_IF_CONFIG_SMALL("ASUS V1"),
318 };
319 #endif
320 
321 #if CONFIG_ASV2_DECODER
322 AVCodec ff_asv2_decoder = {
323  .name = "asv2",
324  .type = AVMEDIA_TYPE_VIDEO,
325  .id = AV_CODEC_ID_ASV2,
326  .priv_data_size = sizeof(ASV1Context),
327  .init = decode_init,
328  .close = decode_end,
329  .decode = decode_frame,
330  .capabilities = CODEC_CAP_DR1,
331  .long_name = NULL_IF_CONFIG_SMALL("ASUS V2"),
332 };
333 #endif
334 
static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: asvdec.c:203
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
This structure describes decoded (raw) audio or video data.
Definition: frame.h:76
const uint8_t ff_asv_ac_ccp_tab[16][2]
Definition: asv.c:59
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:240
memory handling functions
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
AVCodecContext * avctx
Definition: asv.h:39
#define VLC_BITS
Definition: asvdec.c:36
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size)
Same behaviour av_fast_malloc but the buffer has additional FF_INPUT_BUFFER_PADDING_SIZE at the end w...
uint8_t permutated[64]
Definition: dsputil.h:116
static int asv2_decode_block(ASV1Context *a, int16_t block[64])
Definition: asvdec.c:127
unsigned int bitstream_buffer_size
Definition: asv.h:54
static int get_sbits(GetBitContext *s, int n)
Definition: get_bits.h:225
Macro definitions for various function/variable attributes.
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
Definition: mem.c:198
const uint8_t ff_asv2_level_tab[63][2]
Definition: asv.c:66
static av_cold int decode_init(AVCodecContext *avctx)
Definition: asvdec.c:269
uint8_t
#define av_cold
Definition: attributes.h:78
#define INIT_VLC_STATIC(vlc, bits, a, b, c, d, e, f, g, static_size)
Definition: get_bits.h:445
uint8_t * bitstream_buffer
Definition: asv.h:53
static VLC asv2_level_vlc
Definition: asvdec.c:43
#define emms_c()
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
#define CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
const uint8_t ff_asv_ccp_tab[17][2]
Definition: asv.c:42
static int asv2_get_level(GetBitContext *gb)
Definition: asvdec.c:86
uint8_t * data
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:193
uint8_t idct_permutation[64]
idct input permutation.
Definition: dsputil.h:249
const uint8_t ff_asv_dc_ccp_tab[8][2]
Definition: asv.c:54
int mb_height2
Definition: asv.h:49
frame
Definition: stft.m:14
av_cold void ff_asv_common_init(AVCodecContext *avctx)
Definition: asv.c:82
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Spectrum Plot time data
int flags
CODEC_FLAG_*.
void(* clear_blocks)(int16_t *blocks)
Definition: dsputil.h:146
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
const char * name
Name of the codec implementation.
#define ASV2_LEVEL_VLC_BITS
Definition: asvdec.c:37
uint16_t intra_matrix[64]
Definition: asv.h:51
ASUS V1/V2 encoder/decoder common data.
external API header
struct ASV1Context ASV1Context
Definition: get_bits.h:63
ScanTable scantable
Definition: asv.h:44
static int asv2_get_bits(GetBitContext *gb, int n)
Definition: asvdec.c:71
GetBitContext gb
Definition: asv.h:43
enum AVPictureType pict_type
Picture type of the frame.
Definition: frame.h:144
ret
Definition: avfilter.c:821
static VLC level_vlc
Definition: asvdec.c:40
static int decode_mb(ASV1Context *a, int16_t block[6][64])
Definition: asvdec.c:163
static VLC ccp_vlc
Definition: asvdec.c:39
static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE(*table)[2], int bits, int max_depth)
Parse a vlc code.
Definition: get_bits.h:524
int mb_width
Definition: asv.h:46
or the Software in violation of any applicable export control laws in any jurisdiction Except as provided by mandatorily applicable UPF has no obligation to provide you with source code to the Software In the event Software contains any source code
static VLC ac_ccp_vlc
Definition: asvdec.c:42
enum AVCodecID codec_id
DSPContext dsp
Definition: asv.h:40
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition: frame.h:101
main external API structure.
static VLC dc_ccp_vlc
Definition: asvdec.c:41
static void close(AVCodecParserContext *s)
Definition: h264_parser.c:375
MPEG1/2 tables.
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
void * buf
Definition: avisynth_c.h:594
int index
Definition: gxfenc.c:89
synthesis window for stochastic i
void(* bswap_buf)(uint32_t *dst, const uint32_t *src, int w)
Definition: dsputil.h:208
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:379
const uint16_t ff_mpeg1_default_intra_matrix[256]
Definition: mpeg12data.c:30
int mb_width2
Definition: asv.h:48
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Buffer references ownership and permissions
static void idct_put(ASV1Context *a, AVFrame *frame, int mb_x, int mb_y)
Definition: asvdec.c:183
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:87
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:68
int inv_qscale
Definition: asv.h:45
common internal api header.
#define CODEC_FLAG_GRAY
Only decode/encode grayscale.
Same thing on a dB scale
void(* idct_put)(uint8_t *dest, int line_size, int16_t *block)
block -> idct -> clip to unsigned 8 bit -> dest.
Definition: dsputil.h:229
void ff_init_scantable(uint8_t *permutation, ScanTable *st, const uint8_t *src_scantable)
Definition: dsputil.c:110
VLC_TYPE(* table)[2]
code, bits
Definition: get_bits.h:65
static av_cold void init_vlcs(ASV1Context *a)
Definition: asvdec.c:45
int key_frame
1 -> keyframe, 0-> not
Definition: frame.h:139
static int asv1_get_level(GetBitContext *gb)
Definition: asvdec.c:76
void INT64 INT64 count
Definition: avisynth_c.h:594
static int decode(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: crystalhd.c:868
const uint8_t ff_reverse[256]
Definition: mathtables.c:72
static int asv1_decode_block(ASV1Context *a, int16_t block[64])
Definition: asvdec.c:96
const uint8_t ff_asv_scantab[64]
Definition: asv.c:31
static av_cold int decode_end(AVCodecContext *avctx)
Definition: asvdec.c:297
const uint8_t ff_asv_level_tab[7][2]
Definition: asv.c:50
This structure stores compressed data.
int mb_height
Definition: asv.h:47
bitstream writer API