1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Copyright (c) 2003 Michael Niedermayer 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * This file is part of FFmpeg. 5cabdff1aSopenharmony_ci * 6cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 7cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 8cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 9cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 10cabdff1aSopenharmony_ci * 11cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 12cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 13cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14cabdff1aSopenharmony_ci * Lesser General Public License for more details. 15cabdff1aSopenharmony_ci * 16cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 17cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 18cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19cabdff1aSopenharmony_ci */ 20cabdff1aSopenharmony_ci 21cabdff1aSopenharmony_ci/** 22cabdff1aSopenharmony_ci * @file 23cabdff1aSopenharmony_ci * ASUS V1/V2 encoder. 24cabdff1aSopenharmony_ci */ 25cabdff1aSopenharmony_ci 26cabdff1aSopenharmony_ci#include "config_components.h" 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci#include "libavutil/attributes.h" 29cabdff1aSopenharmony_ci#include "libavutil/mem.h" 30cabdff1aSopenharmony_ci 31cabdff1aSopenharmony_ci#include "aandcttab.h" 32cabdff1aSopenharmony_ci#include "asv.h" 33cabdff1aSopenharmony_ci#include "avcodec.h" 34cabdff1aSopenharmony_ci#include "codec_internal.h" 35cabdff1aSopenharmony_ci#include "dct.h" 36cabdff1aSopenharmony_ci#include "encode.h" 37cabdff1aSopenharmony_ci#include "fdctdsp.h" 38cabdff1aSopenharmony_ci#include "mpeg12data.h" 39cabdff1aSopenharmony_ci 40cabdff1aSopenharmony_cistatic inline void asv1_put_level(PutBitContext *pb, int level) 41cabdff1aSopenharmony_ci{ 42cabdff1aSopenharmony_ci unsigned int index = level + 3; 43cabdff1aSopenharmony_ci 44cabdff1aSopenharmony_ci if (index <= 6) { 45cabdff1aSopenharmony_ci put_bits(pb, ff_asv_level_tab[index][1], ff_asv_level_tab[index][0]); 46cabdff1aSopenharmony_ci } else { 47cabdff1aSopenharmony_ci put_bits(pb, 3, 0); /* Escape code */ 48cabdff1aSopenharmony_ci put_sbits(pb, 8, level); 49cabdff1aSopenharmony_ci } 50cabdff1aSopenharmony_ci} 51cabdff1aSopenharmony_ci 52cabdff1aSopenharmony_cistatic inline void asv2_put_level(ASV1Context *a, PutBitContext *pb, int level) 53cabdff1aSopenharmony_ci{ 54cabdff1aSopenharmony_ci unsigned int index = level + 31; 55cabdff1aSopenharmony_ci 56cabdff1aSopenharmony_ci if (index <= 62) { 57cabdff1aSopenharmony_ci put_bits_le(pb, ff_asv2_level_tab[index][1], ff_asv2_level_tab[index][0]); 58cabdff1aSopenharmony_ci } else { 59cabdff1aSopenharmony_ci put_bits_le(pb, 5, 0); /* Escape code */ 60cabdff1aSopenharmony_ci if (level < -128 || level > 127) { 61cabdff1aSopenharmony_ci av_log(a->avctx, AV_LOG_WARNING, "Clipping level %d, increase qscale\n", level); 62cabdff1aSopenharmony_ci level = av_clip_int8(level); 63cabdff1aSopenharmony_ci } 64cabdff1aSopenharmony_ci put_bits_le(pb, 8, level & 0xFF); 65cabdff1aSopenharmony_ci } 66cabdff1aSopenharmony_ci} 67cabdff1aSopenharmony_ci 68cabdff1aSopenharmony_cistatic inline void asv1_encode_block(ASV1Context *a, int16_t block[64]) 69cabdff1aSopenharmony_ci{ 70cabdff1aSopenharmony_ci int i; 71cabdff1aSopenharmony_ci int nc_count = 0; 72cabdff1aSopenharmony_ci 73cabdff1aSopenharmony_ci put_bits(&a->pb, 8, (block[0] + 32) >> 6); 74cabdff1aSopenharmony_ci block[0] = 0; 75cabdff1aSopenharmony_ci 76cabdff1aSopenharmony_ci for (i = 0; i < 10; i++) { 77cabdff1aSopenharmony_ci const int index = ff_asv_scantab[4 * i]; 78cabdff1aSopenharmony_ci int ccp = 0; 79cabdff1aSopenharmony_ci 80cabdff1aSopenharmony_ci if ((block[index + 0] = (block[index + 0] * 81cabdff1aSopenharmony_ci a->q_intra_matrix[index + 0] + (1 << 15)) >> 16)) 82cabdff1aSopenharmony_ci ccp |= 8; 83cabdff1aSopenharmony_ci if ((block[index + 8] = (block[index + 8] * 84cabdff1aSopenharmony_ci a->q_intra_matrix[index + 8] + (1 << 15)) >> 16)) 85cabdff1aSopenharmony_ci ccp |= 4; 86cabdff1aSopenharmony_ci if ((block[index + 1] = (block[index + 1] * 87cabdff1aSopenharmony_ci a->q_intra_matrix[index + 1] + (1 << 15)) >> 16)) 88cabdff1aSopenharmony_ci ccp |= 2; 89cabdff1aSopenharmony_ci if ((block[index + 9] = (block[index + 9] * 90cabdff1aSopenharmony_ci a->q_intra_matrix[index + 9] + (1 << 15)) >> 16)) 91cabdff1aSopenharmony_ci ccp |= 1; 92cabdff1aSopenharmony_ci 93cabdff1aSopenharmony_ci if (ccp) { 94cabdff1aSopenharmony_ci for (; nc_count; nc_count--) 95cabdff1aSopenharmony_ci put_bits(&a->pb, 2, 2); /* Skip */ 96cabdff1aSopenharmony_ci 97cabdff1aSopenharmony_ci put_bits(&a->pb, ff_asv_ccp_tab[ccp][1], ff_asv_ccp_tab[ccp][0]); 98cabdff1aSopenharmony_ci 99cabdff1aSopenharmony_ci if (ccp & 8) 100cabdff1aSopenharmony_ci asv1_put_level(&a->pb, block[index + 0]); 101cabdff1aSopenharmony_ci if (ccp & 4) 102cabdff1aSopenharmony_ci asv1_put_level(&a->pb, block[index + 8]); 103cabdff1aSopenharmony_ci if (ccp & 2) 104cabdff1aSopenharmony_ci asv1_put_level(&a->pb, block[index + 1]); 105cabdff1aSopenharmony_ci if (ccp & 1) 106cabdff1aSopenharmony_ci asv1_put_level(&a->pb, block[index + 9]); 107cabdff1aSopenharmony_ci } else { 108cabdff1aSopenharmony_ci nc_count++; 109cabdff1aSopenharmony_ci } 110cabdff1aSopenharmony_ci } 111cabdff1aSopenharmony_ci put_bits(&a->pb, 5, 0xF); /* End of block */ 112cabdff1aSopenharmony_ci} 113cabdff1aSopenharmony_ci 114cabdff1aSopenharmony_cistatic inline void asv2_encode_block(ASV1Context *a, int16_t block[64]) 115cabdff1aSopenharmony_ci{ 116cabdff1aSopenharmony_ci int i; 117cabdff1aSopenharmony_ci int count = 0; 118cabdff1aSopenharmony_ci 119cabdff1aSopenharmony_ci for (count = 63; count > 3; count--) { 120cabdff1aSopenharmony_ci const int index = ff_asv_scantab[count]; 121cabdff1aSopenharmony_ci if ((block[index] * a->q_intra_matrix[index] + (1 << 15)) >> 16) 122cabdff1aSopenharmony_ci break; 123cabdff1aSopenharmony_ci } 124cabdff1aSopenharmony_ci 125cabdff1aSopenharmony_ci count >>= 2; 126cabdff1aSopenharmony_ci 127cabdff1aSopenharmony_ci put_bits_le(&a->pb, 4, count); 128cabdff1aSopenharmony_ci put_bits_le(&a->pb, 8, (block[0] + 32) >> 6); 129cabdff1aSopenharmony_ci block[0] = 0; 130cabdff1aSopenharmony_ci 131cabdff1aSopenharmony_ci for (i = 0; i <= count; i++) { 132cabdff1aSopenharmony_ci const int index = ff_asv_scantab[4 * i]; 133cabdff1aSopenharmony_ci int ccp = 0; 134cabdff1aSopenharmony_ci 135cabdff1aSopenharmony_ci if ((block[index + 0] = (block[index + 0] * 136cabdff1aSopenharmony_ci a->q_intra_matrix[index + 0] + (1 << 15)) >> 16)) 137cabdff1aSopenharmony_ci ccp |= 8; 138cabdff1aSopenharmony_ci if ((block[index + 8] = (block[index + 8] * 139cabdff1aSopenharmony_ci a->q_intra_matrix[index + 8] + (1 << 15)) >> 16)) 140cabdff1aSopenharmony_ci ccp |= 4; 141cabdff1aSopenharmony_ci if ((block[index + 1] = (block[index + 1] * 142cabdff1aSopenharmony_ci a->q_intra_matrix[index + 1] + (1 << 15)) >> 16)) 143cabdff1aSopenharmony_ci ccp |= 2; 144cabdff1aSopenharmony_ci if ((block[index + 9] = (block[index + 9] * 145cabdff1aSopenharmony_ci a->q_intra_matrix[index + 9] + (1 << 15)) >> 16)) 146cabdff1aSopenharmony_ci ccp |= 1; 147cabdff1aSopenharmony_ci 148cabdff1aSopenharmony_ci av_assert2(i || ccp < 8); 149cabdff1aSopenharmony_ci if (i) 150cabdff1aSopenharmony_ci put_bits_le(&a->pb, ff_asv_ac_ccp_tab[ccp][1], ff_asv_ac_ccp_tab[ccp][0]); 151cabdff1aSopenharmony_ci else 152cabdff1aSopenharmony_ci put_bits_le(&a->pb, ff_asv_dc_ccp_tab[ccp][1], ff_asv_dc_ccp_tab[ccp][0]); 153cabdff1aSopenharmony_ci 154cabdff1aSopenharmony_ci if (ccp) { 155cabdff1aSopenharmony_ci if (ccp & 8) 156cabdff1aSopenharmony_ci asv2_put_level(a, &a->pb, block[index + 0]); 157cabdff1aSopenharmony_ci if (ccp & 4) 158cabdff1aSopenharmony_ci asv2_put_level(a, &a->pb, block[index + 8]); 159cabdff1aSopenharmony_ci if (ccp & 2) 160cabdff1aSopenharmony_ci asv2_put_level(a, &a->pb, block[index + 1]); 161cabdff1aSopenharmony_ci if (ccp & 1) 162cabdff1aSopenharmony_ci asv2_put_level(a, &a->pb, block[index + 9]); 163cabdff1aSopenharmony_ci } 164cabdff1aSopenharmony_ci } 165cabdff1aSopenharmony_ci} 166cabdff1aSopenharmony_ci 167cabdff1aSopenharmony_ci#define MAX_MB_SIZE (30 * 16 * 16 * 3 / 2 / 8) 168cabdff1aSopenharmony_ci 169cabdff1aSopenharmony_cistatic inline int encode_mb(ASV1Context *a, int16_t block[6][64]) 170cabdff1aSopenharmony_ci{ 171cabdff1aSopenharmony_ci int i; 172cabdff1aSopenharmony_ci 173cabdff1aSopenharmony_ci av_assert0(put_bytes_left(&a->pb, 0) >= MAX_MB_SIZE); 174cabdff1aSopenharmony_ci 175cabdff1aSopenharmony_ci if (a->avctx->codec_id == AV_CODEC_ID_ASV1) { 176cabdff1aSopenharmony_ci for (i = 0; i < 6; i++) 177cabdff1aSopenharmony_ci asv1_encode_block(a, block[i]); 178cabdff1aSopenharmony_ci } else { 179cabdff1aSopenharmony_ci for (i = 0; i < 6; i++) { 180cabdff1aSopenharmony_ci asv2_encode_block(a, block[i]); 181cabdff1aSopenharmony_ci } 182cabdff1aSopenharmony_ci } 183cabdff1aSopenharmony_ci return 0; 184cabdff1aSopenharmony_ci} 185cabdff1aSopenharmony_ci 186cabdff1aSopenharmony_cistatic inline void dct_get(ASV1Context *a, const AVFrame *frame, 187cabdff1aSopenharmony_ci int mb_x, int mb_y) 188cabdff1aSopenharmony_ci{ 189cabdff1aSopenharmony_ci int16_t (*block)[64] = a->block; 190cabdff1aSopenharmony_ci int linesize = frame->linesize[0]; 191cabdff1aSopenharmony_ci int i; 192cabdff1aSopenharmony_ci 193cabdff1aSopenharmony_ci uint8_t *ptr_y = frame->data[0] + (mb_y * 16 * linesize) + mb_x * 16; 194cabdff1aSopenharmony_ci uint8_t *ptr_cb = frame->data[1] + (mb_y * 8 * frame->linesize[1]) + mb_x * 8; 195cabdff1aSopenharmony_ci uint8_t *ptr_cr = frame->data[2] + (mb_y * 8 * frame->linesize[2]) + mb_x * 8; 196cabdff1aSopenharmony_ci 197cabdff1aSopenharmony_ci a->pdsp.get_pixels(block[0], ptr_y, linesize); 198cabdff1aSopenharmony_ci a->pdsp.get_pixels(block[1], ptr_y + 8, linesize); 199cabdff1aSopenharmony_ci a->pdsp.get_pixels(block[2], ptr_y + 8 * linesize, linesize); 200cabdff1aSopenharmony_ci a->pdsp.get_pixels(block[3], ptr_y + 8 * linesize + 8, linesize); 201cabdff1aSopenharmony_ci for (i = 0; i < 4; i++) 202cabdff1aSopenharmony_ci a->fdsp.fdct(block[i]); 203cabdff1aSopenharmony_ci 204cabdff1aSopenharmony_ci if (!(a->avctx->flags & AV_CODEC_FLAG_GRAY)) { 205cabdff1aSopenharmony_ci a->pdsp.get_pixels(block[4], ptr_cb, frame->linesize[1]); 206cabdff1aSopenharmony_ci a->pdsp.get_pixels(block[5], ptr_cr, frame->linesize[2]); 207cabdff1aSopenharmony_ci for (i = 4; i < 6; i++) 208cabdff1aSopenharmony_ci a->fdsp.fdct(block[i]); 209cabdff1aSopenharmony_ci } 210cabdff1aSopenharmony_ci} 211cabdff1aSopenharmony_ci 212cabdff1aSopenharmony_cistatic int encode_frame(AVCodecContext *avctx, AVPacket *pkt, 213cabdff1aSopenharmony_ci const AVFrame *pict, int *got_packet) 214cabdff1aSopenharmony_ci{ 215cabdff1aSopenharmony_ci ASV1Context *const a = avctx->priv_data; 216cabdff1aSopenharmony_ci int size, ret; 217cabdff1aSopenharmony_ci int mb_x, mb_y; 218cabdff1aSopenharmony_ci 219cabdff1aSopenharmony_ci if (pict->width % 16 || pict->height % 16) { 220cabdff1aSopenharmony_ci AVFrame *clone = av_frame_alloc(); 221cabdff1aSopenharmony_ci int i; 222cabdff1aSopenharmony_ci 223cabdff1aSopenharmony_ci if (!clone) 224cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 225cabdff1aSopenharmony_ci clone->format = pict->format; 226cabdff1aSopenharmony_ci clone->width = FFALIGN(pict->width, 16); 227cabdff1aSopenharmony_ci clone->height = FFALIGN(pict->height, 16); 228cabdff1aSopenharmony_ci ret = av_frame_get_buffer(clone, 0); 229cabdff1aSopenharmony_ci if (ret < 0) { 230cabdff1aSopenharmony_ci av_frame_free(&clone); 231cabdff1aSopenharmony_ci return ret; 232cabdff1aSopenharmony_ci } 233cabdff1aSopenharmony_ci 234cabdff1aSopenharmony_ci ret = av_frame_copy(clone, pict); 235cabdff1aSopenharmony_ci if (ret < 0) { 236cabdff1aSopenharmony_ci av_frame_free(&clone); 237cabdff1aSopenharmony_ci return ret; 238cabdff1aSopenharmony_ci } 239cabdff1aSopenharmony_ci 240cabdff1aSopenharmony_ci for (i = 0; i<3; i++) { 241cabdff1aSopenharmony_ci int x, y; 242cabdff1aSopenharmony_ci int w = AV_CEIL_RSHIFT(pict->width, !!i); 243cabdff1aSopenharmony_ci int h = AV_CEIL_RSHIFT(pict->height, !!i); 244cabdff1aSopenharmony_ci int w2 = AV_CEIL_RSHIFT(clone->width, !!i); 245cabdff1aSopenharmony_ci int h2 = AV_CEIL_RSHIFT(clone->height, !!i); 246cabdff1aSopenharmony_ci for (y=0; y<h; y++) 247cabdff1aSopenharmony_ci for (x=w; x<w2; x++) 248cabdff1aSopenharmony_ci clone->data[i][x + y*clone->linesize[i]] = 249cabdff1aSopenharmony_ci clone->data[i][w - 1 + y*clone->linesize[i]]; 250cabdff1aSopenharmony_ci for (y=h; y<h2; y++) 251cabdff1aSopenharmony_ci for (x=0; x<w2; x++) 252cabdff1aSopenharmony_ci clone->data[i][x + y*clone->linesize[i]] = 253cabdff1aSopenharmony_ci clone->data[i][x + (h-1)*clone->linesize[i]]; 254cabdff1aSopenharmony_ci } 255cabdff1aSopenharmony_ci ret = encode_frame(avctx, pkt, clone, got_packet); 256cabdff1aSopenharmony_ci 257cabdff1aSopenharmony_ci av_frame_free(&clone); 258cabdff1aSopenharmony_ci return ret; 259cabdff1aSopenharmony_ci } 260cabdff1aSopenharmony_ci 261cabdff1aSopenharmony_ci if ((ret = ff_alloc_packet(avctx, pkt, a->mb_height * a->mb_width * MAX_MB_SIZE + 262cabdff1aSopenharmony_ci AV_INPUT_BUFFER_MIN_SIZE)) < 0) 263cabdff1aSopenharmony_ci return ret; 264cabdff1aSopenharmony_ci 265cabdff1aSopenharmony_ci init_put_bits(&a->pb, pkt->data, pkt->size); 266cabdff1aSopenharmony_ci 267cabdff1aSopenharmony_ci for (mb_y = 0; mb_y < a->mb_height2; mb_y++) { 268cabdff1aSopenharmony_ci for (mb_x = 0; mb_x < a->mb_width2; mb_x++) { 269cabdff1aSopenharmony_ci dct_get(a, pict, mb_x, mb_y); 270cabdff1aSopenharmony_ci encode_mb(a, a->block); 271cabdff1aSopenharmony_ci } 272cabdff1aSopenharmony_ci } 273cabdff1aSopenharmony_ci 274cabdff1aSopenharmony_ci if (a->mb_width2 != a->mb_width) { 275cabdff1aSopenharmony_ci mb_x = a->mb_width2; 276cabdff1aSopenharmony_ci for (mb_y = 0; mb_y < a->mb_height2; mb_y++) { 277cabdff1aSopenharmony_ci dct_get(a, pict, mb_x, mb_y); 278cabdff1aSopenharmony_ci encode_mb(a, a->block); 279cabdff1aSopenharmony_ci } 280cabdff1aSopenharmony_ci } 281cabdff1aSopenharmony_ci 282cabdff1aSopenharmony_ci if (a->mb_height2 != a->mb_height) { 283cabdff1aSopenharmony_ci mb_y = a->mb_height2; 284cabdff1aSopenharmony_ci for (mb_x = 0; mb_x < a->mb_width; mb_x++) { 285cabdff1aSopenharmony_ci dct_get(a, pict, mb_x, mb_y); 286cabdff1aSopenharmony_ci encode_mb(a, a->block); 287cabdff1aSopenharmony_ci } 288cabdff1aSopenharmony_ci } 289cabdff1aSopenharmony_ci emms_c(); 290cabdff1aSopenharmony_ci 291cabdff1aSopenharmony_ci if (avctx->codec_id == AV_CODEC_ID_ASV1) 292cabdff1aSopenharmony_ci flush_put_bits(&a->pb); 293cabdff1aSopenharmony_ci else 294cabdff1aSopenharmony_ci flush_put_bits_le(&a->pb); 295cabdff1aSopenharmony_ci AV_WN32(put_bits_ptr(&a->pb), 0); 296cabdff1aSopenharmony_ci size = (put_bytes_output(&a->pb) + 3) / 4; 297cabdff1aSopenharmony_ci 298cabdff1aSopenharmony_ci if (avctx->codec_id == AV_CODEC_ID_ASV1) { 299cabdff1aSopenharmony_ci a->bbdsp.bswap_buf((uint32_t *) pkt->data, 300cabdff1aSopenharmony_ci (uint32_t *) pkt->data, size); 301cabdff1aSopenharmony_ci } 302cabdff1aSopenharmony_ci 303cabdff1aSopenharmony_ci pkt->size = size * 4; 304cabdff1aSopenharmony_ci *got_packet = 1; 305cabdff1aSopenharmony_ci 306cabdff1aSopenharmony_ci return 0; 307cabdff1aSopenharmony_ci} 308cabdff1aSopenharmony_ci 309cabdff1aSopenharmony_cistatic av_cold int encode_init(AVCodecContext *avctx) 310cabdff1aSopenharmony_ci{ 311cabdff1aSopenharmony_ci ASV1Context *const a = avctx->priv_data; 312cabdff1aSopenharmony_ci int i; 313cabdff1aSopenharmony_ci const int scale = avctx->codec_id == AV_CODEC_ID_ASV1 ? 1 : 2; 314cabdff1aSopenharmony_ci 315cabdff1aSopenharmony_ci ff_asv_common_init(avctx); 316cabdff1aSopenharmony_ci ff_fdctdsp_init(&a->fdsp, avctx); 317cabdff1aSopenharmony_ci ff_pixblockdsp_init(&a->pdsp, avctx); 318cabdff1aSopenharmony_ci 319cabdff1aSopenharmony_ci if (avctx->global_quality <= 0) 320cabdff1aSopenharmony_ci avctx->global_quality = 4 * FF_QUALITY_SCALE; 321cabdff1aSopenharmony_ci 322cabdff1aSopenharmony_ci a->inv_qscale = (32 * scale * FF_QUALITY_SCALE + 323cabdff1aSopenharmony_ci avctx->global_quality / 2) / avctx->global_quality; 324cabdff1aSopenharmony_ci 325cabdff1aSopenharmony_ci avctx->extradata = av_mallocz(8); 326cabdff1aSopenharmony_ci if (!avctx->extradata) 327cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 328cabdff1aSopenharmony_ci avctx->extradata_size = 8; 329cabdff1aSopenharmony_ci ((uint32_t *) avctx->extradata)[0] = av_le2ne32(a->inv_qscale); 330cabdff1aSopenharmony_ci ((uint32_t *) avctx->extradata)[1] = av_le2ne32(AV_RL32("ASUS")); 331cabdff1aSopenharmony_ci 332cabdff1aSopenharmony_ci for (i = 0; i < 64; i++) { 333cabdff1aSopenharmony_ci if (a->fdsp.fdct == ff_fdct_ifast) { 334cabdff1aSopenharmony_ci int q = 32LL * scale * ff_mpeg1_default_intra_matrix[i] * ff_aanscales[i]; 335cabdff1aSopenharmony_ci a->q_intra_matrix[i] = (((int64_t)a->inv_qscale << 30) + q / 2) / q; 336cabdff1aSopenharmony_ci } else { 337cabdff1aSopenharmony_ci int q = 32 * scale * ff_mpeg1_default_intra_matrix[i]; 338cabdff1aSopenharmony_ci a->q_intra_matrix[i] = ((a->inv_qscale << 16) + q / 2) / q; 339cabdff1aSopenharmony_ci } 340cabdff1aSopenharmony_ci } 341cabdff1aSopenharmony_ci 342cabdff1aSopenharmony_ci return 0; 343cabdff1aSopenharmony_ci} 344cabdff1aSopenharmony_ci 345cabdff1aSopenharmony_ci#if CONFIG_ASV1_ENCODER 346cabdff1aSopenharmony_ciconst FFCodec ff_asv1_encoder = { 347cabdff1aSopenharmony_ci .p.name = "asv1", 348cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("ASUS V1"), 349cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_VIDEO, 350cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_ASV1, 351cabdff1aSopenharmony_ci .priv_data_size = sizeof(ASV1Context), 352cabdff1aSopenharmony_ci .init = encode_init, 353cabdff1aSopenharmony_ci FF_CODEC_ENCODE_CB(encode_frame), 354cabdff1aSopenharmony_ci .p.pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P, 355cabdff1aSopenharmony_ci AV_PIX_FMT_NONE }, 356cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, 357cabdff1aSopenharmony_ci}; 358cabdff1aSopenharmony_ci#endif 359cabdff1aSopenharmony_ci 360cabdff1aSopenharmony_ci#if CONFIG_ASV2_ENCODER 361cabdff1aSopenharmony_ciconst FFCodec ff_asv2_encoder = { 362cabdff1aSopenharmony_ci .p.name = "asv2", 363cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("ASUS V2"), 364cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_VIDEO, 365cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_ASV2, 366cabdff1aSopenharmony_ci .priv_data_size = sizeof(ASV1Context), 367cabdff1aSopenharmony_ci .init = encode_init, 368cabdff1aSopenharmony_ci FF_CODEC_ENCODE_CB(encode_frame), 369cabdff1aSopenharmony_ci .p.pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P, 370cabdff1aSopenharmony_ci AV_PIX_FMT_NONE }, 371cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, 372cabdff1aSopenharmony_ci}; 373cabdff1aSopenharmony_ci#endif 374