2 * Copyright (c) 2003 Michael Niedermayer
4 * This file is part of FFmpeg.
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.
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.
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
26 #include "libavutil/attributes.h"
27 #include "libavutil/mem.h"
29 #include "aandcttab.h"
36 #include "mpeg12data.h"
38 static inline void asv2_put_bits(PutBitContext
*pb
, int n
, int v
)
40 put_bits(pb
, n
, ff_reverse
[v
<< (8 - n
)]);
43 static inline void asv1_put_level(PutBitContext
*pb
, int level
)
45 unsigned int index
= level
+ 3;
48 put_bits(pb
, ff_asv_level_tab
[index
][1], ff_asv_level_tab
[index
][0]);
50 put_bits(pb
, ff_asv_level_tab
[3][1], ff_asv_level_tab
[3][0]);
51 put_sbits(pb
, 8, level
);
55 static inline void asv2_put_level(PutBitContext
*pb
, int level
)
57 unsigned int index
= level
+ 31;
60 put_bits(pb
, ff_asv2_level_tab
[index
][1], ff_asv2_level_tab
[index
][0]);
62 put_bits(pb
, ff_asv2_level_tab
[31][1], ff_asv2_level_tab
[31][0]);
63 asv2_put_bits(pb
, 8, level
& 0xFF);
67 static inline void asv1_encode_block(ASV1Context
*a
, int16_t block
[64])
72 put_bits(&a
->pb
, 8, (block
[0] + 32) >> 6);
75 for (i
= 0; i
< 10; i
++) {
76 const int index
= ff_asv_scantab
[4 * i
];
79 if ((block
[index
+ 0] = (block
[index
+ 0] *
80 a
->q_intra_matrix
[index
+ 0] + (1 << 15)) >> 16))
82 if ((block
[index
+ 8] = (block
[index
+ 8] *
83 a
->q_intra_matrix
[index
+ 8] + (1 << 15)) >> 16))
85 if ((block
[index
+ 1] = (block
[index
+ 1] *
86 a
->q_intra_matrix
[index
+ 1] + (1 << 15)) >> 16))
88 if ((block
[index
+ 9] = (block
[index
+ 9] *
89 a
->q_intra_matrix
[index
+ 9] + (1 << 15)) >> 16))
93 for (; nc_count
; nc_count
--)
94 put_bits(&a
->pb
, ff_asv_ccp_tab
[0][1], ff_asv_ccp_tab
[0][0]);
96 put_bits(&a
->pb
, ff_asv_ccp_tab
[ccp
][1], ff_asv_ccp_tab
[ccp
][0]);
99 asv1_put_level(&a
->pb
, block
[index
+ 0]);
101 asv1_put_level(&a
->pb
, block
[index
+ 8]);
103 asv1_put_level(&a
->pb
, block
[index
+ 1]);
105 asv1_put_level(&a
->pb
, block
[index
+ 9]);
110 put_bits(&a
->pb
, ff_asv_ccp_tab
[16][1], ff_asv_ccp_tab
[16][0]);
113 static inline void asv2_encode_block(ASV1Context
*a
, int16_t block
[64])
118 for (count
= 63; count
> 3; count
--) {
119 const int index
= ff_asv_scantab
[count
];
120 if ((block
[index
] * a
->q_intra_matrix
[index
] + (1 << 15)) >> 16)
126 asv2_put_bits(&a
->pb
, 4, count
);
127 asv2_put_bits(&a
->pb
, 8, (block
[0] + 32) >> 6);
130 for (i
= 0; i
<= count
; i
++) {
131 const int index
= ff_asv_scantab
[4 * i
];
134 if ((block
[index
+ 0] = (block
[index
+ 0] *
135 a
->q_intra_matrix
[index
+ 0] + (1 << 15)) >> 16))
137 if ((block
[index
+ 8] = (block
[index
+ 8] *
138 a
->q_intra_matrix
[index
+ 8] + (1 << 15)) >> 16))
140 if ((block
[index
+ 1] = (block
[index
+ 1] *
141 a
->q_intra_matrix
[index
+ 1] + (1 << 15)) >> 16))
143 if ((block
[index
+ 9] = (block
[index
+ 9] *
144 a
->q_intra_matrix
[index
+ 9] + (1 << 15)) >> 16))
147 av_assert2(i
|| ccp
< 8);
149 put_bits(&a
->pb
, ff_asv_ac_ccp_tab
[ccp
][1], ff_asv_ac_ccp_tab
[ccp
][0]);
151 put_bits(&a
->pb
, ff_asv_dc_ccp_tab
[ccp
][1], ff_asv_dc_ccp_tab
[ccp
][0]);
155 asv2_put_level(&a
->pb
, block
[index
+ 0]);
157 asv2_put_level(&a
->pb
, block
[index
+ 8]);
159 asv2_put_level(&a
->pb
, block
[index
+ 1]);
161 asv2_put_level(&a
->pb
, block
[index
+ 9]);
166 #define MAX_MB_SIZE (30 * 16 * 16 * 3 / 2 / 8)
168 static inline int encode_mb(ASV1Context
*a
, int16_t block
[6][64])
172 if (a
->pb
.buf_end
- a
->pb
.buf
- (put_bits_count(&a
->pb
) >> 3) < MAX_MB_SIZE
) {
173 av_log(a
->avctx
, AV_LOG_ERROR
, "encoded frame too large\n");
177 if (a
->avctx
->codec_id
== AV_CODEC_ID_ASV1
) {
178 for (i
= 0; i
< 6; i
++)
179 asv1_encode_block(a
, block
[i
]);
181 for (i
= 0; i
< 6; i
++)
182 asv2_encode_block(a
, block
[i
]);
187 static inline void dct_get(ASV1Context
*a
, const AVFrame
*frame
,
190 int16_t (*block
)[64] = a
->block
;
191 int linesize
= frame
->linesize
[0];
194 uint8_t *ptr_y
= frame
->data
[0] + (mb_y
* 16 * linesize
) + mb_x
* 16;
195 uint8_t *ptr_cb
= frame
->data
[1] + (mb_y
* 8 * frame
->linesize
[1]) + mb_x
* 8;
196 uint8_t *ptr_cr
= frame
->data
[2] + (mb_y
* 8 * frame
->linesize
[2]) + mb_x
* 8;
198 a
->pdsp
.get_pixels(block
[0], ptr_y
, linesize
);
199 a
->pdsp
.get_pixels(block
[1], ptr_y
+ 8, linesize
);
200 a
->pdsp
.get_pixels(block
[2], ptr_y
+ 8 * linesize
, linesize
);
201 a
->pdsp
.get_pixels(block
[3], ptr_y
+ 8 * linesize
+ 8, linesize
);
202 for (i
= 0; i
< 4; i
++)
203 a
->fdsp
.fdct(block
[i
]);
205 if (!(a
->avctx
->flags
& CODEC_FLAG_GRAY
)) {
206 a
->pdsp
.get_pixels(block
[4], ptr_cb
, frame
->linesize
[1]);
207 a
->pdsp
.get_pixels(block
[5], ptr_cr
, frame
->linesize
[2]);
208 for (i
= 4; i
< 6; i
++)
209 a
->fdsp
.fdct(block
[i
]);
213 static int encode_frame(AVCodecContext
*avctx
, AVPacket
*pkt
,
214 const AVFrame
*pict
, int *got_packet
)
216 ASV1Context
*const a
= avctx
->priv_data
;
220 if (pict
->width
% 16 || pict
->height
% 16) {
221 AVFrame
*clone
= av_frame_alloc();
225 return AVERROR(ENOMEM
);
226 clone
->format
= pict
->format
;
227 clone
->width
= FFALIGN(pict
->width
, 16);
228 clone
->height
= FFALIGN(pict
->height
, 16);
229 ret
= av_frame_get_buffer(clone
, 32);
231 av_frame_free(&clone
);
235 ret
= av_frame_copy(clone
, pict
);
237 av_frame_free(&clone
);
241 for (i
= 0; i
<3; i
++) {
243 int w
= FF_CEIL_RSHIFT(pict
->width
, !!i
);
244 int h
= FF_CEIL_RSHIFT(pict
->height
, !!i
);
245 int w2
= FF_CEIL_RSHIFT(clone
->width
, !!i
);
246 int h2
= FF_CEIL_RSHIFT(clone
->height
, !!i
);
249 clone
->data
[i
][x
+ y
*clone
->linesize
[i
]] =
250 clone
->data
[i
][w
- 1 + y
*clone
->linesize
[i
]];
253 clone
->data
[i
][x
+ y
*clone
->linesize
[i
]] =
254 clone
->data
[i
][x
+ (h
-1)*clone
->linesize
[i
]];
256 ret
= encode_frame(avctx
, pkt
, clone
, got_packet
);
258 av_frame_free(&clone
);
262 if ((ret
= ff_alloc_packet2(avctx
, pkt
, a
->mb_height
* a
->mb_width
* MAX_MB_SIZE
+
263 FF_MIN_BUFFER_SIZE
)) < 0)
266 init_put_bits(&a
->pb
, pkt
->data
, pkt
->size
);
268 for (mb_y
= 0; mb_y
< a
->mb_height2
; mb_y
++) {
269 for (mb_x
= 0; mb_x
< a
->mb_width2
; mb_x
++) {
270 dct_get(a
, pict
, mb_x
, mb_y
);
271 encode_mb(a
, a
->block
);
275 if (a
->mb_width2
!= a
->mb_width
) {
277 for (mb_y
= 0; mb_y
< a
->mb_height2
; mb_y
++) {
278 dct_get(a
, pict
, mb_x
, mb_y
);
279 encode_mb(a
, a
->block
);
283 if (a
->mb_height2
!= a
->mb_height
) {
284 mb_y
= a
->mb_height2
;
285 for (mb_x
= 0; mb_x
< a
->mb_width
; mb_x
++) {
286 dct_get(a
, pict
, mb_x
, mb_y
);
287 encode_mb(a
, a
->block
);
292 avpriv_align_put_bits(&a
->pb
);
293 while (put_bits_count(&a
->pb
) & 31)
294 put_bits(&a
->pb
, 8, 0);
296 size
= put_bits_count(&a
->pb
) / 32;
298 if (avctx
->codec_id
== AV_CODEC_ID_ASV1
) {
299 a
->bbdsp
.bswap_buf((uint32_t *) pkt
->data
,
300 (uint32_t *) pkt
->data
, size
);
303 for (i
= 0; i
< 4 * size
; i
++)
304 pkt
->data
[i
] = ff_reverse
[pkt
->data
[i
]];
307 pkt
->size
= size
* 4;
308 pkt
->flags
|= AV_PKT_FLAG_KEY
;
314 static av_cold
int encode_init(AVCodecContext
*avctx
)
316 ASV1Context
*const a
= avctx
->priv_data
;
318 const int scale
= avctx
->codec_id
== AV_CODEC_ID_ASV1
? 1 : 2;
320 ff_asv_common_init(avctx
);
321 ff_fdctdsp_init(&a
->fdsp
, avctx
);
322 ff_pixblockdsp_init(&a
->pdsp
, avctx
);
324 if (avctx
->global_quality
<= 0)
325 avctx
->global_quality
= 4 * FF_QUALITY_SCALE
;
327 a
->inv_qscale
= (32 * scale
* FF_QUALITY_SCALE
+
328 avctx
->global_quality
/ 2) / avctx
->global_quality
;
330 avctx
->extradata
= av_mallocz(8);
331 avctx
->extradata_size
= 8;
332 ((uint32_t *) avctx
->extradata
)[0] = av_le2ne32(a
->inv_qscale
);
333 ((uint32_t *) avctx
->extradata
)[1] = av_le2ne32(AV_RL32("ASUS"));
335 for (i
= 0; i
< 64; i
++) {
336 if (a
->fdsp
.fdct
== ff_fdct_ifast
) {
337 int q
= 32LL * scale
* ff_mpeg1_default_intra_matrix
[i
] * ff_aanscales
[i
];
338 a
->q_intra_matrix
[i
] = (((int64_t)a
->inv_qscale
<< 30) + q
/ 2) / q
;
340 int q
= 32 * scale
* ff_mpeg1_default_intra_matrix
[i
];
341 a
->q_intra_matrix
[i
] = ((a
->inv_qscale
<< 16) + q
/ 2) / q
;
348 #if CONFIG_ASV1_ENCODER
349 AVCodec ff_asv1_encoder
= {
351 .long_name
= NULL_IF_CONFIG_SMALL("ASUS V1"),
352 .type
= AVMEDIA_TYPE_VIDEO
,
353 .id
= AV_CODEC_ID_ASV1
,
354 .priv_data_size
= sizeof(ASV1Context
),
356 .encode2
= encode_frame
,
357 .pix_fmts
= (const enum AVPixelFormat
[]) { AV_PIX_FMT_YUV420P
,
362 #if CONFIG_ASV2_ENCODER
363 AVCodec ff_asv2_encoder
= {
365 .long_name
= NULL_IF_CONFIG_SMALL("ASUS V2"),
366 .type
= AVMEDIA_TYPE_VIDEO
,
367 .id
= AV_CODEC_ID_ASV2
,
368 .priv_data_size
= sizeof(ASV1Context
),
370 .encode2
= encode_frame
,
371 .pix_fmts
= (const enum AVPixelFormat
[]) { AV_PIX_FMT_YUV420P
,