| Line | Branch | Exec | Source |
|---|---|---|---|
| 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 | #include "libavutil/mem_internal.h" | ||
| 29 | #include "libavutil/thread.h" | ||
| 30 | |||
| 31 | #include "asv.h" | ||
| 32 | #include "avcodec.h" | ||
| 33 | #include "blockdsp.h" | ||
| 34 | #include "codec_internal.h" | ||
| 35 | #include "config_components.h" | ||
| 36 | #include "decode.h" | ||
| 37 | #include "get_bits.h" | ||
| 38 | #include "idctdsp.h" | ||
| 39 | #include "mpeg12data.h" | ||
| 40 | #include "vlc.h" | ||
| 41 | |||
| 42 | #define CCP_VLC_BITS 5 | ||
| 43 | #define DC_CCP_VLC_BITS 4 | ||
| 44 | #define AC_CCP_VLC_BITS 6 | ||
| 45 | #define ASV1_LEVEL_VLC_BITS 4 | ||
| 46 | #define ASV2_LEVEL_VLC_BITS 10 | ||
| 47 | |||
| 48 | static VLCElem ccp_vlc[32]; | ||
| 49 | static VLCElem level_vlc[16]; | ||
| 50 | static VLCElem dc_ccp_vlc[16]; | ||
| 51 | static VLCElem ac_ccp_vlc[64]; | ||
| 52 | static VLCElem asv2_level_vlc[1024]; | ||
| 53 | |||
| 54 | typedef struct ASVDecContext { | ||
| 55 | ASVCommonContext c; | ||
| 56 | |||
| 57 | GetBitContext gb; | ||
| 58 | |||
| 59 | BlockDSPContext bdsp; | ||
| 60 | IDCTDSPContext idsp; | ||
| 61 | uint8_t permutated_scantable[64]; | ||
| 62 | DECLARE_ALIGNED(32, int16_t, block)[6][64]; | ||
| 63 | uint16_t intra_matrix[64]; | ||
| 64 | uint8_t *bitstream_buffer; | ||
| 65 | unsigned int bitstream_buffer_size; | ||
| 66 | } ASVDecContext; | ||
| 67 | |||
| 68 | 10 | static av_cold void init_vlcs(void) | |
| 69 | { | ||
| 70 | 10 | VLC_INIT_STATIC_TABLE(ccp_vlc, CCP_VLC_BITS, 17, | |
| 71 | &ff_asv_ccp_tab[0][1], 2, 1, | ||
| 72 | &ff_asv_ccp_tab[0][0], 2, 1, 0); | ||
| 73 | 10 | VLC_INIT_STATIC_TABLE(dc_ccp_vlc, DC_CCP_VLC_BITS, 8, | |
| 74 | &ff_asv_dc_ccp_tab[0][1], 2, 1, | ||
| 75 | &ff_asv_dc_ccp_tab[0][0], 2, 1, VLC_INIT_LE); | ||
| 76 | 10 | VLC_INIT_STATIC_TABLE(ac_ccp_vlc, AC_CCP_VLC_BITS, 16, | |
| 77 | &ff_asv_ac_ccp_tab[0][1], 2, 1, | ||
| 78 | &ff_asv_ac_ccp_tab[0][0], 2, 1, VLC_INIT_LE); | ||
| 79 | 10 | VLC_INIT_STATIC_TABLE(level_vlc, ASV1_LEVEL_VLC_BITS, 7, | |
| 80 | &ff_asv_level_tab[0][1], 2, 1, | ||
| 81 | &ff_asv_level_tab[0][0], 2, 1, 0); | ||
| 82 | 10 | VLC_INIT_STATIC_TABLE(asv2_level_vlc, ASV2_LEVEL_VLC_BITS, 63, | |
| 83 | &ff_asv2_level_tab[0][1], 4, 2, | ||
| 84 | &ff_asv2_level_tab[0][0], 4, 2, VLC_INIT_LE); | ||
| 85 | 10 | } | |
| 86 | |||
| 87 | 2970458 | static inline int asv1_get_level(GetBitContext *gb) | |
| 88 | { | ||
| 89 | 2970458 | int code = get_vlc2(gb, level_vlc, ASV1_LEVEL_VLC_BITS, 1); | |
| 90 | |||
| 91 |
2/2✓ Branch 0 taken 428811 times.
✓ Branch 1 taken 2541647 times.
|
2970458 | if (code == 3) |
| 92 | 428811 | return get_sbits(gb, 8); | |
| 93 | else | ||
| 94 | 2541647 | return code - 3; | |
| 95 | } | ||
| 96 | |||
| 97 | // get_vlc2() is big-endian in this file | ||
| 98 | 6005036 | static inline int asv2_get_vlc2(GetBitContext *gb, const VLCElem *table, int bits) | |
| 99 | { | ||
| 100 | unsigned int index; | ||
| 101 | int code, n; | ||
| 102 | |||
| 103 | 6005036 | OPEN_READER(re, gb); | |
| 104 | 6005036 | UPDATE_CACHE_LE(re, gb); | |
| 105 | |||
| 106 | 6005036 | index = SHOW_UBITS_LE(re, gb, bits); | |
| 107 | 6005036 | code = table[index].sym; | |
| 108 | 6005036 | n = table[index].len; | |
| 109 | 6005036 | LAST_SKIP_BITS(re, gb, n); | |
| 110 | |||
| 111 | 6005036 | CLOSE_READER(re, gb); | |
| 112 | |||
| 113 | 6005036 | return code; | |
| 114 | } | ||
| 115 | |||
| 116 | 3657862 | static inline int asv2_get_level(GetBitContext *gb) | |
| 117 | { | ||
| 118 | 3657862 | int code = asv2_get_vlc2(gb, asv2_level_vlc, ASV2_LEVEL_VLC_BITS); | |
| 119 | |||
| 120 |
2/2✓ Branch 0 taken 613 times.
✓ Branch 1 taken 3657249 times.
|
3657862 | if (code == 31) |
| 121 | 613 | return (int8_t) get_bits_le(gb, 8); | |
| 122 | else | ||
| 123 | 3657249 | return code - 31; | |
| 124 | } | ||
| 125 | |||
| 126 | 359100 | static inline int asv1_decode_block(ASVDecContext *a, int16_t block[64]) | |
| 127 | { | ||
| 128 | int i; | ||
| 129 | |||
| 130 | 359100 | block[0] = 8 * get_bits(&a->gb, 8); | |
| 131 | |||
| 132 |
1/2✓ Branch 0 taken 2125515 times.
✗ Branch 1 not taken.
|
2125515 | for (i = 0; i < 11; i++) { |
| 133 | 2125515 | const int ccp = get_vlc2(&a->gb, ccp_vlc, CCP_VLC_BITS, 1); | |
| 134 | |||
| 135 |
2/2✓ Branch 0 taken 1721901 times.
✓ Branch 1 taken 403614 times.
|
2125515 | if (ccp) { |
| 136 |
2/2✓ Branch 0 taken 359100 times.
✓ Branch 1 taken 1362801 times.
|
1721901 | if (ccp == 16) |
| 137 | 359100 | break; | |
| 138 |
2/4✓ Branch 0 taken 1362801 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1362801 times.
|
1362801 | if (ccp < 0 || i >= 10) { |
| 139 | ✗ | av_log(a->c.avctx, AV_LOG_ERROR, "coded coeff pattern damaged\n"); | |
| 140 | ✗ | return AVERROR_INVALIDDATA; | |
| 141 | } | ||
| 142 | |||
| 143 |
2/2✓ Branch 0 taken 758490 times.
✓ Branch 1 taken 604311 times.
|
1362801 | if (ccp & 8) |
| 144 | 758490 | block[a->permutated_scantable[4 * i + 0]] = (asv1_get_level(&a->gb) * a->intra_matrix[4 * i + 0]) >> 4; | |
| 145 |
2/2✓ Branch 0 taken 827835 times.
✓ Branch 1 taken 534966 times.
|
1362801 | if (ccp & 4) |
| 146 | 827835 | block[a->permutated_scantable[4 * i + 1]] = (asv1_get_level(&a->gb) * a->intra_matrix[4 * i + 1]) >> 4; | |
| 147 |
2/2✓ Branch 0 taken 780446 times.
✓ Branch 1 taken 582355 times.
|
1362801 | if (ccp & 2) |
| 148 | 780446 | block[a->permutated_scantable[4 * i + 2]] = (asv1_get_level(&a->gb) * a->intra_matrix[4 * i + 2]) >> 4; | |
| 149 |
2/2✓ Branch 0 taken 603687 times.
✓ Branch 1 taken 759114 times.
|
1362801 | if (ccp & 1) |
| 150 | 603687 | block[a->permutated_scantable[4 * i + 3]] = (asv1_get_level(&a->gb) * a->intra_matrix[4 * i + 3]) >> 4; | |
| 151 | } | ||
| 152 | } | ||
| 153 | |||
| 154 | 359100 | return 0; | |
| 155 | } | ||
| 156 | |||
| 157 | 359100 | static inline int asv2_decode_block(ASVDecContext *a, int16_t block[64]) | |
| 158 | { | ||
| 159 | int i, count, ccp; | ||
| 160 | |||
| 161 | 359100 | count = get_bits_le(&a->gb, 4); | |
| 162 | |||
| 163 | 359100 | block[0] = 8 * get_bits_le(&a->gb, 8); | |
| 164 | |||
| 165 | 359100 | ccp = asv2_get_vlc2(&a->gb, dc_ccp_vlc, DC_CCP_VLC_BITS); | |
| 166 |
2/2✓ Branch 0 taken 328605 times.
✓ Branch 1 taken 30495 times.
|
359100 | if (ccp) { |
| 167 |
2/2✓ Branch 0 taken 281268 times.
✓ Branch 1 taken 47337 times.
|
328605 | if (ccp & 4) |
| 168 | 281268 | block[a->permutated_scantable[1]] = (asv2_get_level(&a->gb) * a->intra_matrix[1]) >> 4; | |
| 169 |
2/2✓ Branch 0 taken 284269 times.
✓ Branch 1 taken 44336 times.
|
328605 | if (ccp & 2) |
| 170 | 284269 | block[a->permutated_scantable[2]] = (asv2_get_level(&a->gb) * a->intra_matrix[2]) >> 4; | |
| 171 |
2/2✓ Branch 0 taken 226812 times.
✓ Branch 1 taken 101793 times.
|
328605 | if (ccp & 1) |
| 172 | 226812 | block[a->permutated_scantable[3]] = (asv2_get_level(&a->gb) * a->intra_matrix[3]) >> 4; | |
| 173 | } | ||
| 174 | |||
| 175 |
2/2✓ Branch 0 taken 1988074 times.
✓ Branch 1 taken 359100 times.
|
2347174 | for (i = 1; i < count + 1; i++) { |
| 176 | 1988074 | const int ccp = asv2_get_vlc2(&a->gb, ac_ccp_vlc, AC_CCP_VLC_BITS); | |
| 177 | |||
| 178 |
2/2✓ Branch 0 taken 1367549 times.
✓ Branch 1 taken 620525 times.
|
1988074 | if (ccp) { |
| 179 |
2/2✓ Branch 0 taken 967939 times.
✓ Branch 1 taken 399610 times.
|
1367549 | if (ccp & 8) |
| 180 | 967939 | block[a->permutated_scantable[4 * i + 0]] = (asv2_get_level(&a->gb) * a->intra_matrix[4 * i + 0]) >> 4; | |
| 181 |
2/2✓ Branch 0 taken 732551 times.
✓ Branch 1 taken 634998 times.
|
1367549 | if (ccp & 4) |
| 182 | 732551 | block[a->permutated_scantable[4 * i + 1]] = (asv2_get_level(&a->gb) * a->intra_matrix[4 * i + 1]) >> 4; | |
| 183 |
2/2✓ Branch 0 taken 666451 times.
✓ Branch 1 taken 701098 times.
|
1367549 | if (ccp & 2) |
| 184 | 666451 | block[a->permutated_scantable[4 * i + 2]] = (asv2_get_level(&a->gb) * a->intra_matrix[4 * i + 2]) >> 4; | |
| 185 |
2/2✓ Branch 0 taken 498572 times.
✓ Branch 1 taken 868977 times.
|
1367549 | if (ccp & 1) |
| 186 | 498572 | block[a->permutated_scantable[4 * i + 3]] = (asv2_get_level(&a->gb) * a->intra_matrix[4 * i + 3]) >> 4; | |
| 187 | } | ||
| 188 | } | ||
| 189 | |||
| 190 | 359100 | return 0; | |
| 191 | } | ||
| 192 | |||
| 193 | 119700 | static inline int decode_mb(ASVDecContext *a, int16_t block[6][64]) | |
| 194 | { | ||
| 195 | int i, ret; | ||
| 196 | |||
| 197 | 119700 | a->bdsp.clear_blocks(block[0]); | |
| 198 | |||
| 199 |
2/2✓ Branch 0 taken 59850 times.
✓ Branch 1 taken 59850 times.
|
119700 | if (a->c.avctx->codec_id == AV_CODEC_ID_ASV1) { |
| 200 |
2/2✓ Branch 0 taken 359100 times.
✓ Branch 1 taken 59850 times.
|
418950 | for (i = 0; i < 6; i++) { |
| 201 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 359100 times.
|
359100 | if ((ret = asv1_decode_block(a, block[i])) < 0) |
| 202 | ✗ | return ret; | |
| 203 | } | ||
| 204 | } else { | ||
| 205 |
2/2✓ Branch 0 taken 359100 times.
✓ Branch 1 taken 59850 times.
|
418950 | for (i = 0; i < 6; i++) { |
| 206 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 359100 times.
|
359100 | if ((ret = asv2_decode_block(a, block[i])) < 0) |
| 207 | ✗ | return ret; | |
| 208 | } | ||
| 209 | } | ||
| 210 | 119700 | return 0; | |
| 211 | } | ||
| 212 | |||
| 213 | 119700 | static inline void idct_put(ASVDecContext *a, AVFrame *frame, int mb_x, int mb_y) | |
| 214 | { | ||
| 215 | 119700 | int16_t(*block)[64] = a->block; | |
| 216 | 119700 | int linesize = frame->linesize[0]; | |
| 217 | |||
| 218 | 119700 | uint8_t *dest_y = frame->data[0] + (mb_y * 16 * linesize) + mb_x * 16; | |
| 219 | 119700 | uint8_t *dest_cb = frame->data[1] + (mb_y * 8 * frame->linesize[1]) + mb_x * 8; | |
| 220 | 119700 | uint8_t *dest_cr = frame->data[2] + (mb_y * 8 * frame->linesize[2]) + mb_x * 8; | |
| 221 | |||
| 222 | 119700 | a->idsp.idct_put(dest_y, linesize, block[0]); | |
| 223 | 119700 | a->idsp.idct_put(dest_y + 8, linesize, block[1]); | |
| 224 | 119700 | a->idsp.idct_put(dest_y + 8 * linesize, linesize, block[2]); | |
| 225 | 119700 | a->idsp.idct_put(dest_y + 8 * linesize + 8, linesize, block[3]); | |
| 226 | |||
| 227 |
1/2✓ Branch 0 taken 119700 times.
✗ Branch 1 not taken.
|
119700 | if (!(a->c.avctx->flags & AV_CODEC_FLAG_GRAY)) { |
| 228 | 119700 | a->idsp.idct_put(dest_cb, frame->linesize[1], block[4]); | |
| 229 | 119700 | a->idsp.idct_put(dest_cr, frame->linesize[2], block[5]); | |
| 230 | } | ||
| 231 | 119700 | } | |
| 232 | |||
| 233 | 400 | static int decode_frame(AVCodecContext *avctx, AVFrame *p, | |
| 234 | int *got_frame, AVPacket *avpkt) | ||
| 235 | { | ||
| 236 | 400 | ASVDecContext *const a = avctx->priv_data; | |
| 237 | 400 | const ASVCommonContext *const c = &a->c; | |
| 238 | 400 | const uint8_t *buf = avpkt->data; | |
| 239 | 400 | int buf_size = avpkt->size; | |
| 240 | int ret; | ||
| 241 | |||
| 242 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 400 times.
|
400 | if (buf_size * 8LL < c->mb_height * c->mb_width * 13LL) |
| 243 | ✗ | return AVERROR_INVALIDDATA; | |
| 244 | |||
| 245 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 400 times.
|
400 | if ((ret = ff_get_buffer(avctx, p, 0)) < 0) |
| 246 | ✗ | return ret; | |
| 247 | |||
| 248 |
2/2✓ Branch 0 taken 200 times.
✓ Branch 1 taken 200 times.
|
400 | if (avctx->codec_id == AV_CODEC_ID_ASV1) { |
| 249 | 200 | av_fast_padded_malloc(&a->bitstream_buffer, &a->bitstream_buffer_size, | |
| 250 | buf_size); | ||
| 251 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 200 times.
|
200 | if (!a->bitstream_buffer) |
| 252 | ✗ | return AVERROR(ENOMEM); | |
| 253 | |||
| 254 | 200 | c->bbdsp.bswap_buf((uint32_t *) a->bitstream_buffer, | |
| 255 | (const uint32_t *) buf, buf_size / 4); | ||
| 256 | 200 | ret = init_get_bits8(&a->gb, a->bitstream_buffer, buf_size); | |
| 257 | } else { | ||
| 258 | 200 | ret = init_get_bits8_le(&a->gb, buf, buf_size); | |
| 259 | } | ||
| 260 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 400 times.
|
400 | if (ret < 0) |
| 261 | ✗ | return ret; | |
| 262 | |||
| 263 |
2/2✓ Branch 0 taken 5600 times.
✓ Branch 1 taken 400 times.
|
6000 | for (int mb_y = 0; mb_y < c->mb_height2; mb_y++) { |
| 264 |
2/2✓ Branch 0 taken 119200 times.
✓ Branch 1 taken 5600 times.
|
124800 | for (int mb_x = 0; mb_x < c->mb_width2; mb_x++) { |
| 265 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 119200 times.
|
119200 | if ((ret = decode_mb(a, a->block)) < 0) |
| 266 | ✗ | return ret; | |
| 267 | |||
| 268 | 119200 | idct_put(a, p, mb_x, mb_y); | |
| 269 | } | ||
| 270 | } | ||
| 271 | |||
| 272 |
2/2✓ Branch 0 taken 100 times.
✓ Branch 1 taken 300 times.
|
400 | if (c->mb_width2 != c->mb_width) { |
| 273 | 100 | int mb_x = c->mb_width2; | |
| 274 |
2/2✓ Branch 0 taken 200 times.
✓ Branch 1 taken 100 times.
|
300 | for (int mb_y = 0; mb_y < c->mb_height2; mb_y++) { |
| 275 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 200 times.
|
200 | if ((ret = decode_mb(a, a->block)) < 0) |
| 276 | ✗ | return ret; | |
| 277 | |||
| 278 | 200 | idct_put(a, p, mb_x, mb_y); | |
| 279 | } | ||
| 280 | } | ||
| 281 | |||
| 282 |
2/2✓ Branch 0 taken 100 times.
✓ Branch 1 taken 300 times.
|
400 | if (c->mb_height2 != c->mb_height) { |
| 283 | 100 | int mb_y = c->mb_height2; | |
| 284 |
2/2✓ Branch 0 taken 300 times.
✓ Branch 1 taken 100 times.
|
400 | for (int mb_x = 0; mb_x < c->mb_width; mb_x++) { |
| 285 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 300 times.
|
300 | if ((ret = decode_mb(a, a->block)) < 0) |
| 286 | ✗ | return ret; | |
| 287 | |||
| 288 | 300 | idct_put(a, p, mb_x, mb_y); | |
| 289 | } | ||
| 290 | } | ||
| 291 | |||
| 292 | 400 | *got_frame = 1; | |
| 293 | |||
| 294 | 400 | return (get_bits_count(&a->gb) + 31) / 32 * 4; | |
| 295 | } | ||
| 296 | |||
| 297 | 18 | static av_cold int decode_init(AVCodecContext *avctx) | |
| 298 | { | ||
| 299 | static AVOnce init_static_once = AV_ONCE_INIT; | ||
| 300 | 18 | ASVDecContext *const a = avctx->priv_data; | |
| 301 |
2/2✓ Branch 0 taken 9 times.
✓ Branch 1 taken 9 times.
|
18 | const int scale = avctx->codec_id == AV_CODEC_ID_ASV1 ? 1 : 2; |
| 302 | int inv_qscale; | ||
| 303 | int i; | ||
| 304 | |||
| 305 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
|
18 | if (avctx->extradata_size < 1) { |
| 306 | ✗ | av_log(avctx, AV_LOG_WARNING, "No extradata provided\n"); | |
| 307 | } | ||
| 308 | |||
| 309 | 18 | ff_asv_common_init(avctx); | |
| 310 | 18 | ff_blockdsp_init(&a->bdsp); | |
| 311 | 18 | ff_idctdsp_init(&a->idsp, avctx); | |
| 312 | 18 | ff_permute_scantable(a->permutated_scantable, ff_asv_scantab, | |
| 313 | 18 | a->idsp.idct_permutation); | |
| 314 | 18 | avctx->pix_fmt = AV_PIX_FMT_YUV420P; | |
| 315 | |||
| 316 |
2/4✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 18 times.
|
18 | if (avctx->extradata_size < 1 || (inv_qscale = avctx->extradata[0]) == 0) { |
| 317 | ✗ | av_log(avctx, AV_LOG_ERROR, "illegal qscale 0\n"); | |
| 318 | ✗ | if (avctx->codec_id == AV_CODEC_ID_ASV1) | |
| 319 | ✗ | inv_qscale = 6; | |
| 320 | else | ||
| 321 | ✗ | inv_qscale = 10; | |
| 322 | } | ||
| 323 | |||
| 324 |
2/2✓ Branch 0 taken 1152 times.
✓ Branch 1 taken 18 times.
|
1170 | for (i = 0; i < 64; i++) { |
| 325 | 1152 | int index = ff_asv_scantab[i]; | |
| 326 | |||
| 327 | 1152 | a->intra_matrix[i] = 64 * scale * ff_mpeg1_default_intra_matrix[index] / | |
| 328 | inv_qscale; | ||
| 329 | } | ||
| 330 | |||
| 331 | 18 | ff_thread_once(&init_static_once, init_vlcs); | |
| 332 | |||
| 333 | 18 | return 0; | |
| 334 | } | ||
| 335 | |||
| 336 | 9 | static av_cold int decode_end(AVCodecContext *avctx) | |
| 337 | { | ||
| 338 | 9 | ASVDecContext *const a = avctx->priv_data; | |
| 339 | |||
| 340 | 9 | av_freep(&a->bitstream_buffer); | |
| 341 | 9 | a->bitstream_buffer_size = 0; | |
| 342 | |||
| 343 | 9 | return 0; | |
| 344 | } | ||
| 345 | |||
| 346 | #if CONFIG_ASV1_DECODER | ||
| 347 | const FFCodec ff_asv1_decoder = { | ||
| 348 | .p.name = "asv1", | ||
| 349 | CODEC_LONG_NAME("ASUS V1"), | ||
| 350 | .p.type = AVMEDIA_TYPE_VIDEO, | ||
| 351 | .p.id = AV_CODEC_ID_ASV1, | ||
| 352 | .priv_data_size = sizeof(ASVDecContext), | ||
| 353 | .init = decode_init, | ||
| 354 | .close = decode_end, | ||
| 355 | FF_CODEC_DECODE_CB(decode_frame), | ||
| 356 | .p.capabilities = AV_CODEC_CAP_DR1, | ||
| 357 | }; | ||
| 358 | #endif | ||
| 359 | |||
| 360 | #if CONFIG_ASV2_DECODER | ||
| 361 | const FFCodec ff_asv2_decoder = { | ||
| 362 | .p.name = "asv2", | ||
| 363 | CODEC_LONG_NAME("ASUS V2"), | ||
| 364 | .p.type = AVMEDIA_TYPE_VIDEO, | ||
| 365 | .p.id = AV_CODEC_ID_ASV2, | ||
| 366 | .priv_data_size = sizeof(ASVDecContext), | ||
| 367 | .init = decode_init, | ||
| 368 | FF_CODEC_DECODE_CB(decode_frame), | ||
| 369 | .p.capabilities = AV_CODEC_CAP_DR1, | ||
| 370 | }; | ||
| 371 | #endif | ||
| 372 |