Libav
hq_hqa.c
Go to the documentation of this file.
1 /*
2  * Canopus HQ/HQA decoder
3  *
4  * This file is part of Libav.
5  *
6  * Libav 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  * Libav 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 Libav; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #include <stdint.h>
22 
23 #include "libavutil/attributes.h"
24 #include "libavutil/intreadwrite.h"
25 
26 #include "avcodec.h"
27 #include "canopus.h"
28 #include "get_bits.h"
29 #include "internal.h"
30 
31 #include "hq_hqa.h"
32 #include "hq_hqadsp.h"
33 
34 /* HQ/HQA slices are a set of macroblocks belonging to a frame, and
35  * they usually form a pseudorandom pattern (probably because it is
36  * nicer to display on partial decode).
37  *
38  * For HQA it just happens that each slice is on every 8th macroblock,
39  * but they can be on any frame width like
40  * X.......X.
41  * ......X...
42  * ....X.....
43  * ..X.......
44  * etc.
45  *
46  * The original decoder has special handling for edge macroblocks,
47  * while lavc simply aligns coded_width and coded_height.
48  */
49 
50 static inline void put_blocks(HQContext *c, AVFrame *pic,
51  int plane, int x, int y, int ilace,
52  int16_t *block0, int16_t *block1)
53 {
54  uint8_t *p = pic->data[plane] + x;
55 
56  c->hqhqadsp.idct_put(p + y * pic->linesize[plane],
57  pic->linesize[plane] << ilace, block0);
58  c->hqhqadsp.idct_put(p + (y + (ilace ? 1 : 8)) * pic->linesize[plane],
59  pic->linesize[plane] << ilace, block1);
60 }
61 
62 static int hq_decode_block(HQContext *c, GetBitContext *gb, int16_t block[64],
63  int qsel, int is_chroma, int is_hqa)
64 {
65  const int32_t *q;
66  int val, pos = 1;
67 
68  memset(block, 0, 64 * sizeof(*block));
69 
70  if (!is_hqa) {
71  block[0] = get_sbits(gb, 9) << 6;
72  q = ff_hq_quants[qsel][is_chroma][get_bits(gb, 2)];
73  } else {
74  q = ff_hq_quants[qsel][is_chroma][get_bits(gb, 2)];
75  block[0] = get_sbits(gb, 9) << 6;
76  }
77 
78  for (;;) {
79  val = get_vlc2(gb, c->hq_ac_vlc.table, 9, 2);
80  if (val < 0)
81  return AVERROR_INVALIDDATA;
82 
83  pos += ff_hq_ac_skips[val];
84  if (pos >= 64)
85  break;
86  block[ff_zigzag_direct[pos]] = (ff_hq_ac_syms[val] * q[pos]) >> 12;
87  pos++;
88  }
89 
90  return 0;
91 }
92 
93 static int hq_decode_mb(HQContext *c, AVFrame *pic,
94  GetBitContext *gb, int x, int y)
95 {
96  int qgroup, flag;
97  int i, ret;
98 
99  qgroup = get_bits(gb, 4);
100  flag = get_bits1(gb);
101 
102  for (i = 0; i < 8; i++) {
103  ret = hq_decode_block(c, gb, c->block[i], qgroup, i >= 4, 0);
104  if (ret < 0)
105  return ret;
106  }
107 
108  put_blocks(c, pic, 0, x, y, flag, c->block[0], c->block[2]);
109  put_blocks(c, pic, 0, x + 8, y, flag, c->block[1], c->block[3]);
110  put_blocks(c, pic, 2, x >> 1, y, flag, c->block[4], c->block[5]);
111  put_blocks(c, pic, 1, x >> 1, y, flag, c->block[6], c->block[7]);
112 
113  return 0;
114 }
115 
117  int prof_num, size_t data_size)
118 {
119  const HQProfile *profile;
120  GetBitContext gb;
121  const uint8_t *perm, *src = ctx->gbc.buffer;
122  uint32_t slice_off[21];
123  int slice, start_off, next_off, i, ret;
124 
125  if (prof_num >= NUM_HQ_PROFILES) {
126  profile = &ff_hq_profile[0];
127  avpriv_request_sample(ctx->avctx, "HQ Profile %d", prof_num);
128  } else {
129  profile = &ff_hq_profile[prof_num];
130  av_log(ctx->avctx, AV_LOG_VERBOSE, "HQ Profile %d\n", prof_num);
131  }
132 
133  ctx->avctx->coded_width = FFALIGN(profile->width, 16);
134  ctx->avctx->coded_height = FFALIGN(profile->height, 16);
135  ctx->avctx->width = profile->width;
136  ctx->avctx->height = profile->height;
137  ctx->avctx->bits_per_raw_sample = 8;
139 
140  ret = ff_get_buffer(ctx->avctx, pic, 0);
141  if (ret < 0) {
142  av_log(ctx->avctx, AV_LOG_ERROR, "Could not allocate buffer.\n");
143  return ret;
144  }
145 
146  /* Offsets are stored from CUV position, so adjust them accordingly. */
147  for (i = 0; i < profile->num_slices + 1; i++)
148  slice_off[i] = bytestream2_get_be24(&ctx->gbc) - 4;
149 
150  next_off = 0;
151  for (slice = 0; slice < profile->num_slices; slice++) {
152  start_off = next_off;
153  next_off = profile->tab_h * (slice + 1) / profile->num_slices;
154  perm = profile->perm_tab + start_off * profile->tab_w * 2;
155 
156  if (slice_off[slice] < (profile->num_slices + 1) * 3 ||
157  slice_off[slice] >= slice_off[slice + 1] ||
158  slice_off[slice + 1] > data_size) {
159  av_log(ctx->avctx, AV_LOG_ERROR,
160  "Invalid slice size %zu.\n", data_size);
161  break;
162  }
163  init_get_bits(&gb, src + slice_off[slice],
164  (slice_off[slice + 1] - slice_off[slice]) * 8);
165 
166  for (i = 0; i < (next_off - start_off) * profile->tab_w; i++) {
167  ret = hq_decode_mb(ctx, pic, &gb, perm[0] * 16, perm[1] * 16);
168  if (ret < 0) {
169  av_log(ctx->avctx, AV_LOG_ERROR,
170  "Error decoding macroblock %d at slice %d.\n", i, slice);
171  return ret;
172  }
173  perm += 2;
174  }
175  }
176 
177  return 0;
178 }
179 
180 static int hqa_decode_mb(HQContext *c, AVFrame *pic, int qgroup,
181  GetBitContext *gb, int x, int y)
182 {
183  int flag = 0;
184  int i, ret, cbp;
185 
186  cbp = get_vlc2(gb, c->hqa_cbp_vlc.table, 5, 1);
187 
188  for (i = 0; i < 12; i++)
189  memset(c->block[i], 0, sizeof(*c->block));
190  for (i = 0; i < 12; i++)
191  c->block[i][0] = -128 * (1 << 6);
192 
193  if (cbp) {
194  flag = get_bits1(gb);
195 
196  cbp |= cbp << 4;
197  if (cbp & 0x3)
198  cbp |= 0x500;
199  if (cbp & 0xC)
200  cbp |= 0xA00;
201  for (i = 0; i < 12; i++) {
202  if (!(cbp & (1 << i)))
203  continue;
204  ret = hq_decode_block(c, gb, c->block[i], qgroup, i >= 8, 1);
205  if (ret < 0)
206  return ret;
207  }
208  }
209 
210  put_blocks(c, pic, 3, x, y, flag, c->block[ 0], c->block[ 2]);
211  put_blocks(c, pic, 3, x + 8, y, flag, c->block[ 1], c->block[ 3]);
212  put_blocks(c, pic, 0, x, y, flag, c->block[ 4], c->block[ 6]);
213  put_blocks(c, pic, 0, x + 8, y, flag, c->block[ 5], c->block[ 7]);
214  put_blocks(c, pic, 2, x >> 1, y, flag, c->block[ 8], c->block[ 9]);
215  put_blocks(c, pic, 1, x >> 1, y, flag, c->block[10], c->block[11]);
216 
217  return 0;
218 }
219 
221  int quant, int slice_no, int w, int h)
222 {
223  int i, j, off;
224  int ret;
225 
226  for (i = 0; i < h; i += 16) {
227  off = (slice_no * 16 + i * 3) & 0x70;
228  for (j = off; j < w; j += 128) {
229  ret = hqa_decode_mb(ctx, pic, quant, gb, j, i);
230  if (ret < 0) {
231  av_log(ctx->avctx, AV_LOG_ERROR,
232  "Error decoding macroblock at %dx%d.\n", i, j);
233  return ret;
234  }
235  }
236  }
237 
238  return 0;
239 }
240 
241 static int hqa_decode_frame(HQContext *ctx, AVFrame *pic, size_t data_size)
242 {
243  GetBitContext gb;
244  const int num_slices = 8;
245  uint32_t slice_off[9];
246  int i, slice, ret;
247  int width, height, quant;
248  const uint8_t *src = ctx->gbc.buffer;
249 
250  width = bytestream2_get_be16(&ctx->gbc);
251  height = bytestream2_get_be16(&ctx->gbc);
252 
253  ctx->avctx->coded_width = FFALIGN(width, 16);
254  ctx->avctx->coded_height = FFALIGN(height, 16);
255  ctx->avctx->width = width;
256  ctx->avctx->height = height;
257  ctx->avctx->bits_per_raw_sample = 8;
259 
260  av_log(ctx->avctx, AV_LOG_VERBOSE, "HQA Profile\n");
261 
262  quant = bytestream2_get_byte(&ctx->gbc);
263  bytestream2_skip(&ctx->gbc, 3);
264  if (quant >= NUM_HQ_QUANTS) {
265  av_log(ctx->avctx, AV_LOG_ERROR,
266  "Invalid quantization matrix %d.\n", quant);
267  return AVERROR_INVALIDDATA;
268  }
269 
270  ret = ff_get_buffer(ctx->avctx, pic, 0);
271  if (ret < 0) {
272  av_log(ctx->avctx, AV_LOG_ERROR, "Could not allocate buffer.\n");
273  return ret;
274  }
275 
276  /* Offsets are stored from HQA1 position, so adjust them accordingly. */
277  for (i = 0; i < num_slices + 1; i++)
278  slice_off[i] = bytestream2_get_be32(&ctx->gbc) - 4;
279 
280  for (slice = 0; slice < num_slices; slice++) {
281  if (slice_off[slice] < (num_slices + 1) * 3 ||
282  slice_off[slice] >= slice_off[slice + 1] ||
283  slice_off[slice + 1] > data_size) {
284  av_log(ctx->avctx, AV_LOG_ERROR,
285  "Invalid slice size %zu.\n", data_size);
286  break;
287  }
288  init_get_bits(&gb, src + slice_off[slice],
289  (slice_off[slice + 1] - slice_off[slice]) * 8);
290 
291  ret = hqa_decode_slice(ctx, pic, &gb, quant, slice, width, height);
292  if (ret < 0)
293  return ret;
294  }
295 
296  return 0;
297 }
298 
299 static int hq_hqa_decode_frame(AVCodecContext *avctx, void *data,
300  int *got_frame, AVPacket *avpkt)
301 {
302  HQContext *ctx = avctx->priv_data;
303  AVFrame *pic = data;
304  uint32_t info_tag;
305  unsigned int data_size;
306  int tag, ret;
307 
308  bytestream2_init(&ctx->gbc, avpkt->data, avpkt->size);
309  if (bytestream2_get_bytes_left(&ctx->gbc) < 4 + 4) {
310  av_log(avctx, AV_LOG_ERROR, "Frame is too small (%d).\n", avpkt->size);
311  return AVERROR_INVALIDDATA;
312  }
313 
314  info_tag = bytestream2_peek_le32(&ctx->gbc);
315  if (info_tag == MKTAG('I', 'N', 'F', 'O')) {
316  int info_size;
317  bytestream2_skip(&ctx->gbc, 4);
318  info_size = bytestream2_get_le32(&ctx->gbc);
319  if (bytestream2_get_bytes_left(&ctx->gbc) < info_size) {
320  av_log(avctx, AV_LOG_ERROR, "Invalid INFO size (%d).\n", info_size);
321  return AVERROR_INVALIDDATA;
322  }
323  ff_canopus_parse_info_tag(avctx, ctx->gbc.buffer, info_size);
324 
325  bytestream2_skip(&ctx->gbc, info_size);
326  }
327 
328  data_size = bytestream2_get_bytes_left(&ctx->gbc);
329  if (data_size < 4) {
330  av_log(avctx, AV_LOG_ERROR, "Frame is too small (%d).\n", data_size);
331  return AVERROR_INVALIDDATA;
332  }
333 
334  /* HQ defines dimensions and number of slices, and thus slice traversal
335  * order. HQA has no size constraint and a fixed number of slices, so it
336  * needs a separate scheme for it. */
337  tag = bytestream2_get_le32(&ctx->gbc);
338  if ((tag & 0x00FFFFFF) == (MKTAG('U', 'V', 'C', ' ') & 0x00FFFFFF)) {
339  ret = hq_decode_frame(ctx, pic, tag >> 24, data_size);
340  } else if (tag == MKTAG('H', 'Q', 'A', '1')) {
341  ret = hqa_decode_frame(ctx, pic, data_size);
342  } else {
343  av_log(avctx, AV_LOG_ERROR, "Not a HQ/HQA frame.\n");
344  return AVERROR_INVALIDDATA;
345  }
346  if (ret < 0) {
347  av_log(avctx, AV_LOG_ERROR, "Error decoding frame.\n");
348  return ret;
349  }
350 
351  pic->key_frame = 1;
353 
354  *got_frame = 1;
355 
356  return avpkt->size;
357 }
358 
360 {
361  HQContext *ctx = avctx->priv_data;
362  ctx->avctx = avctx;
363 
364  ff_hqdsp_init(&ctx->hqhqadsp);
365 
366  return ff_hq_init_vlcs(ctx);
367 }
368 
370 {
371  HQContext *ctx = avctx->priv_data;
372 
373  ff_free_vlc(&ctx->hq_ac_vlc);
374  ff_free_vlc(&ctx->hqa_cbp_vlc);
375 
376  return 0;
377 }
378 
380  .name = "hq_hqa",
381  .long_name = NULL_IF_CONFIG_SMALL("Canopus HQ/HQA"),
382  .type = AVMEDIA_TYPE_VIDEO,
383  .id = AV_CODEC_ID_HQ_HQA,
384  .priv_data_size = sizeof(HQContext),
387  .close = hq_hqa_decode_close,
388  .capabilities = AV_CODEC_CAP_DR1,
389  .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE |
391 };
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
Definition: internal.h:48
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:54
This structure describes decoded (raw) audio or video data.
Definition: frame.h:140
int width
Definition: hq_hqa.h:47
int coded_width
Bitstream width / height, may be different from width/height e.g.
Definition: avcodec.h:1595
static int hq_decode_frame(HQContext *ctx, AVFrame *pic, int prof_num, size_t data_size)
Definition: hq_hqa.c:116
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:228
int16_t block[12][64]
Definition: hq_hqa.h:42
int ff_canopus_parse_info_tag(AVCodecContext *avctx, const uint8_t *src, size_t size)
Definition: canopus.c:30
int size
Definition: avcodec.h:1347
int flag
Definition: cpu.c:35
av_log(ac->avr, AV_LOG_TRACE, "%d samples - audio_convert: %s to %s (%s)\, len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt), use_generic ? ac->func_descr_generic :ac->func_descr)
static int hq_hqa_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: hq_hqa.c:299
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:1621
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
Definition: bytestream.h:132
static av_cold int hq_hqa_decode_init(AVCodecContext *avctx)
Definition: hq_hqa.c:359
static int hq_decode_mb(HQContext *c, AVFrame *pic, GetBitContext *gb, int x, int y)
Definition: hq_hqa.c:93
const int32_t *const ff_hq_quants[16][2][4]
Definition: hq_hqadata.c:1126
int bits_per_raw_sample
Bits per sample/pixel of internal libavcodec pixel/sample format.
Definition: avcodec.h:2776
AVCodec.
Definition: avcodec.h:3120
AVCodec ff_hq_hqa_decoder
Definition: hq_hqa.c:379
static int get_sbits(GetBitContext *s, int n)
Definition: get_bits.h:214
const HQProfile ff_hq_profile[NUM_HQ_PROFILES]
Definition: hq_hqadata.c:8343
const uint8_t * perm_tab
Definition: hq_hqa.h:46
Macro definitions for various function/variable attributes.
VLC hq_ac_vlc
Definition: hq_hqa.h:40
HQ/HQA variant of AAN IDCT It differs from the standard AAN IDCT in precision and in the second stage...
static int16_t block[64]
Definition: dct.c:97
void void avpriv_request_sample(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
Definition: internal.h:40
uint8_t
#define av_cold
Definition: attributes.h:66
const char data[16]
Definition: mxf.c:70
uint8_t * data
Definition: avcodec.h:1346
const uint8_t * buffer
Definition: bytestream.h:33
uint32_t tag
Definition: movenc.c:854
static int hqa_decode_slice(HQContext *ctx, AVFrame *pic, GetBitContext *gb, int quant, int slice_no, int w, int h)
Definition: hq_hqa.c:220
bitstream reader API header.
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:140
void(* idct_put)(uint8_t *dst, int stride, int16_t *block)
Definition: hq_hqadsp.h:33
#define FFALIGN(x, a)
Definition: macros.h:48
#define src
Definition: vp8dsp.c:254
planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)
Definition: pixfmt.h:169
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:124
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
Definition: bytestream.h:161
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Definition: internal.h:148
static av_always_inline unsigned int bytestream2_get_bytes_left(GetByteContext *g)
Definition: bytestream.h:151
const char * name
Name of the codec implementation.
Definition: avcodec.h:3127
int num_slices
Definition: hq_hqa.h:48
int tab_h
Definition: hq_hqa.h:49
VLC hqa_cbp_vlc
Definition: hq_hqa.h:41
int ff_hq_init_vlcs(HQContext *c)
Definition: hq_hqadata.c:8368
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition: pixfmt.h:63
static int hqa_decode_mb(HQContext *c, AVFrame *pic, int qgroup, GetBitContext *gb, int x, int y)
Definition: hq_hqa.c:180
enum AVPictureType pict_type
Picture type of the frame.
Definition: frame.h:201
int width
picture width / height.
Definition: avcodec.h:1580
static int decode(AVCodecContext *avctx, AVFrame *frame, int *got_frame, AVPacket *pkt)
Definition: avconv.c:1288
static int hqa_decode_frame(HQContext *ctx, AVFrame *pic, size_t data_size)
Definition: hq_hqa.c:241
int32_t
AVFormatContext * ctx
Definition: movenc.c:48
#define NUM_HQ_PROFILES
Definition: hq_hqa.h:32
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:493
if(ac->has_optimized_func)
static int width
Definition: utils.c:156
GetByteContext gbc
Definition: hq_hqa.h:38
Libavcodec external API header.
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition: frame.h:158
main external API structure.
Definition: avcodec.h:1409
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition: utils.c:589
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:267
const int16_t ff_hq_ac_syms[NUM_HQ_AC_ENTRIES]
Definition: hq_hqadata.c:1342
int coded_height
Definition: avcodec.h:1595
int tab_w
Definition: hq_hqa.h:49
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:362
const uint8_t ff_zigzag_direct[64]
Definition: mathtables.c:115
static void put_blocks(HQContext *c, AVFrame *pic, int plane, int x, int y, int ilace, int16_t *block0, int16_t *block1)
Definition: hq_hqa.c:50
mfxU16 profile
Definition: qsvenc.c:43
const uint8_t * quant
#define NUM_HQ_QUANTS
Definition: hq_hqa.h:33
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:146
int height
Definition: gxfenc.c:72
common internal api header.
static av_cold int init(AVCodecParserContext *s)
Definition: h264_parser.c:582
static int hq_decode_block(HQContext *c, GetBitContext *gb, int16_t block[64], int qsel, int is_chroma, int is_hqa)
Definition: hq_hqa.c:62
void * priv_data
Definition: avcodec.h:1451
static av_cold int hq_hqa_decode_close(AVCodecContext *avctx)
Definition: hq_hqa.c:369
AVCodecContext * avctx
Definition: hq_hqa.h:36
HQDSPContext hqhqadsp
Definition: hq_hqa.h:37
VLC_TYPE(* table)[2]
code, bits
Definition: vlc.h:28
int key_frame
1 -> keyframe, 0-> not
Definition: frame.h:196
static int16_t block1[64]
Definition: dct.c:98
av_cold void ff_hqdsp_init(HQDSPContext *c)
Definition: hq_hqadsp.c:127
int height
Definition: hq_hqa.h:47
#define MKTAG(a, b, c, d)
Definition: common.h:256
This structure stores compressed data.
Definition: avcodec.h:1323
void ff_free_vlc(VLC *vlc)
Definition: bitstream.c:334
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
Definition: avcodec.h:838
const uint8_t ff_hq_ac_skips[NUM_HQ_AC_ENTRIES]
Definition: hq_hqadata.c:1292