3 * Copyright (C) 2004 Mike Melanson <melanson@pcisys.net>
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 * Sorenson Vector Quantizer #1 (SVQ1) video codec.
25 * For more information of the SVQ1 algorithm, visit:
26 * http://www.pcisys.net/~melanson/codecs/
32 #include "mpegvideo.h"
35 #include "mpegutils.h"
38 #include "svq1enc_cb.h"
39 #include "libavutil/avassert.h"
42 static void svq1_write_header(SVQ1EncContext
*s
, int frame_type
)
47 put_bits(&s
->pb
, 22, 0x20);
49 /* temporal reference (sure hope this is a "don't care") */
50 put_bits(&s
->pb
, 8, 0x00);
53 put_bits(&s
->pb
, 2, frame_type
- 1);
55 if (frame_type
== AV_PICTURE_TYPE_I
) {
56 /* no checksum since frame code is 0x20 */
57 /* no embedded string either */
58 /* output 5 unknown bits (2 + 2 + 1) */
59 put_bits(&s
->pb
, 5, 2); /* 2 needed by quicktime decoder */
61 i
= ff_match_2uint16((void*)ff_svq1_frame_size_table
,
62 FF_ARRAY_ELEMS(ff_svq1_frame_size_table
),
63 s
->frame_width
, s
->frame_height
);
64 put_bits(&s
->pb
, 3, i
);
67 put_bits(&s
->pb
, 12, s
->frame_width
);
68 put_bits(&s
->pb
, 12, s
->frame_height
);
72 /* no checksum or extra data (next 2 bits get 0) */
73 put_bits(&s
->pb
, 2, 0);
76 #define QUALITY_THRESHOLD 100
77 #define THRESHOLD_MULTIPLIER 0.6
79 static int ssd_int8_vs_int16_c(const int8_t *pix1
, const int16_t *pix2
,
84 for (i
= 0; i
< size
; i
++)
85 score
+= (pix1
[i
] - pix2
[i
]) * (pix1
[i
] - pix2
[i
]);
89 static int encode_block(SVQ1EncContext
*s
, uint8_t *src
, uint8_t *ref
,
90 uint8_t *decoded
, int stride
, int level
,
91 int threshold
, int lambda
, int intra
)
93 int count
, y
, x
, i
, j
, split
, best_mean
, best_score
, best_count
;
95 int block_sum
[7] = { 0, 0, 0, 0, 0, 0 };
96 int w
= 2 << (level
+ 2 >> 1);
97 int h
= 2 << (level
+ 1 >> 1);
99 int16_t (*block
)[256] = s
->encoded_block_levels
[level
];
100 const int8_t *codebook_sum
, *codebook
;
101 const uint16_t(*mean_vlc
)[2];
102 const uint8_t(*multistage_vlc
)[2];
105 // FIXME: Optimize, this does not need to be done multiple times.
107 codebook_sum
= svq1_intra_codebook_sum
[level
];
108 codebook
= ff_svq1_intra_codebooks
[level
];
109 mean_vlc
= ff_svq1_intra_mean_vlc
;
110 multistage_vlc
= ff_svq1_intra_multistage_vlc
[level
];
111 for (y
= 0; y
< h
; y
++) {
112 for (x
= 0; x
< w
; x
++) {
113 int v
= src
[x
+ y
* stride
];
114 block
[0][x
+ w
* y
] = v
;
120 codebook_sum
= svq1_inter_codebook_sum
[level
];
121 codebook
= ff_svq1_inter_codebooks
[level
];
122 mean_vlc
= ff_svq1_inter_mean_vlc
+ 256;
123 multistage_vlc
= ff_svq1_inter_multistage_vlc
[level
];
124 for (y
= 0; y
< h
; y
++) {
125 for (x
= 0; x
< w
; x
++) {
126 int v
= src
[x
+ y
* stride
] - ref
[x
+ y
* stride
];
127 block
[0][x
+ w
* y
] = v
;
135 best_score
-= (int)((unsigned)block_sum
[0] * block_sum
[0] >> (level
+ 3));
136 best_mean
= block_sum
[0] + (size
>> 1) >> (level
+ 3);
139 for (count
= 1; count
< 7; count
++) {
140 int best_vector_score
= INT_MAX
;
141 int best_vector_sum
= -999, best_vector_mean
= -999;
142 const int stage
= count
- 1;
143 const int8_t *vector
;
145 for (i
= 0; i
< 16; i
++) {
146 int sum
= codebook_sum
[stage
* 16 + i
];
147 int sqr
, diff
, score
;
149 vector
= codebook
+ stage
* size
* 16 + i
* size
;
150 sqr
= s
->ssd_int8_vs_int16(vector
, block
[stage
], size
);
151 diff
= block_sum
[stage
] - sum
;
152 score
= sqr
- (diff
* (int64_t)diff
>> (level
+ 3)); // FIXME: 64bit slooow
153 if (score
< best_vector_score
) {
154 int mean
= diff
+ (size
>> 1) >> (level
+ 3);
155 av_assert2(mean
> -300 && mean
< 300);
156 mean
= av_clip(mean
, intra
? 0 : -256, 255);
157 best_vector_score
= score
;
158 best_vector
[stage
] = i
;
159 best_vector_sum
= sum
;
160 best_vector_mean
= mean
;
163 av_assert0(best_vector_mean
!= -999);
164 vector
= codebook
+ stage
* size
* 16 + best_vector
[stage
] * size
;
165 for (j
= 0; j
< size
; j
++)
166 block
[stage
+ 1][j
] = block
[stage
][j
] - vector
[j
];
167 block_sum
[stage
+ 1] = block_sum
[stage
] - best_vector_sum
;
168 best_vector_score
+= lambda
*
170 multistage_vlc
[1 + count
][1]
171 + mean_vlc
[best_vector_mean
][1]);
173 if (best_vector_score
< best_score
) {
174 best_score
= best_vector_score
;
176 best_mean
= best_vector_mean
;
182 if (best_score
> threshold
&& level
) {
184 int offset
= level
& 1 ? stride
* h
/ 2 : w
/ 2;
185 PutBitContext backup
[6];
187 for (i
= level
- 1; i
>= 0; i
--)
188 backup
[i
] = s
->reorder_pb
[i
];
189 score
+= encode_block(s
, src
, ref
, decoded
, stride
, level
- 1,
190 threshold
>> 1, lambda
, intra
);
191 score
+= encode_block(s
, src
+ offset
, ref
+ offset
, decoded
+ offset
,
192 stride
, level
- 1, threshold
>> 1, lambda
, intra
);
195 if (score
< best_score
) {
199 for (i
= level
- 1; i
>= 0; i
--)
200 s
->reorder_pb
[i
] = backup
[i
];
204 put_bits(&s
->reorder_pb
[level
], 1, split
);
207 av_assert1(best_mean
>= 0 && best_mean
< 256 || !intra
);
208 av_assert1(best_mean
>= -256 && best_mean
< 256);
209 av_assert1(best_count
>= 0 && best_count
< 7);
210 av_assert1(level
< 4 || best_count
== 0);
212 /* output the encoding */
213 put_bits(&s
->reorder_pb
[level
],
214 multistage_vlc
[1 + best_count
][1],
215 multistage_vlc
[1 + best_count
][0]);
216 put_bits(&s
->reorder_pb
[level
], mean_vlc
[best_mean
][1],
217 mean_vlc
[best_mean
][0]);
219 for (i
= 0; i
< best_count
; i
++) {
220 av_assert2(best_vector
[i
] >= 0 && best_vector
[i
] < 16);
221 put_bits(&s
->reorder_pb
[level
], 4, best_vector
[i
]);
224 for (y
= 0; y
< h
; y
++)
225 for (x
= 0; x
< w
; x
++)
226 decoded
[x
+ y
* stride
] = src
[x
+ y
* stride
] -
227 block
[best_count
][x
+ w
* y
] +
234 static void init_block_index(MpegEncContext
*s
){
235 s
->block_index
[0]= s
->b8_stride
*(s
->mb_y
*2 ) + s
->mb_x
*2;
236 s
->block_index
[1]= s
->b8_stride
*(s
->mb_y
*2 ) + 1 + s
->mb_x
*2;
237 s
->block_index
[2]= s
->b8_stride
*(s
->mb_y
*2 + 1) + s
->mb_x
*2;
238 s
->block_index
[3]= s
->b8_stride
*(s
->mb_y
*2 + 1) + 1 + s
->mb_x
*2;
239 s
->block_index
[4]= s
->mb_stride
*(s
->mb_y
+ 1) + s
->b8_stride
*s
->mb_height
*2 + s
->mb_x
;
240 s
->block_index
[5]= s
->mb_stride
*(s
->mb_y
+ s
->mb_height
+ 2) + s
->b8_stride
*s
->mb_height
*2 + s
->mb_x
;
243 static int svq1_encode_plane(SVQ1EncContext
*s
, int plane
,
244 unsigned char *src_plane
,
245 unsigned char *ref_plane
,
246 unsigned char *decoded_plane
,
247 int width
, int height
, int src_stride
, int stride
)
249 const AVFrame
*f
= s
->avctx
->coded_frame
;
252 int block_width
, block_height
;
255 uint8_t *src
= s
->scratchbuf
+ stride
* 32;
256 const int lambda
= (f
->quality
* f
->quality
) >>
257 (2 * FF_LAMBDA_SHIFT
);
259 /* figure out the acceptable level thresholds in advance */
260 threshold
[5] = QUALITY_THRESHOLD
;
261 for (level
= 4; level
>= 0; level
--)
262 threshold
[level
] = threshold
[level
+ 1] * THRESHOLD_MULTIPLIER
;
264 block_width
= (width
+ 15) / 16;
265 block_height
= (height
+ 15) / 16;
267 if (f
->pict_type
== AV_PICTURE_TYPE_P
) {
268 s
->m
.avctx
= s
->avctx
;
269 s
->m
.current_picture_ptr
= &s
->m
.current_picture
;
270 s
->m
.last_picture_ptr
= &s
->m
.last_picture
;
271 s
->m
.last_picture
.f
->data
[0] = ref_plane
;
273 s
->m
.last_picture
.f
->linesize
[0] =
274 s
->m
.new_picture
.f
->linesize
[0] =
275 s
->m
.current_picture
.f
->linesize
[0] = stride
;
277 s
->m
.height
= height
;
278 s
->m
.mb_width
= block_width
;
279 s
->m
.mb_height
= block_height
;
280 s
->m
.mb_stride
= s
->m
.mb_width
+ 1;
281 s
->m
.b8_stride
= 2 * s
->m
.mb_width
+ 1;
283 s
->m
.pict_type
= f
->pict_type
;
284 s
->m
.me_method
= s
->avctx
->me_method
;
285 s
->m
.me
.scene_change_score
= 0;
286 s
->m
.flags
= s
->avctx
->flags
;
287 // s->m.out_format = FMT_H263;
288 // s->m.unrestricted_mv = 1;
289 s
->m
.lambda
= f
->quality
;
290 s
->m
.qscale
= s
->m
.lambda
* 139 +
291 FF_LAMBDA_SCALE
* 64 >>
293 s
->m
.lambda2
= s
->m
.lambda
* s
->m
.lambda
+
294 FF_LAMBDA_SCALE
/ 2 >>
297 if (!s
->motion_val8
[plane
]) {
298 s
->motion_val8
[plane
] = av_mallocz((s
->m
.b8_stride
*
299 block_height
* 2 + 2) *
300 2 * sizeof(int16_t));
301 s
->motion_val16
[plane
] = av_mallocz((s
->m
.mb_stride
*
302 (block_height
+ 2) + 1) *
303 2 * sizeof(int16_t));
306 s
->m
.mb_type
= s
->mb_type
;
308 // dummies, to avoid segfaults
309 s
->m
.current_picture
.mb_mean
= (uint8_t *)s
->dummy
;
310 s
->m
.current_picture
.mb_var
= (uint16_t *)s
->dummy
;
311 s
->m
.current_picture
.mc_mb_var
= (uint16_t *)s
->dummy
;
312 s
->m
.current_picture
.mb_type
= s
->dummy
;
314 s
->m
.current_picture
.motion_val
[0] = s
->motion_val8
[plane
] + 2;
315 s
->m
.p_mv_table
= s
->motion_val16
[plane
] +
317 s
->m
.mecc
= s
->mecc
; // move
320 s
->m
.me
.dia_size
= s
->avctx
->dia_size
;
321 s
->m
.first_slice_line
= 1;
322 for (y
= 0; y
< block_height
; y
++) {
323 s
->m
.new_picture
.f
->data
[0] = src
- y
* 16 * stride
; // ugly
326 for (i
= 0; i
< 16 && i
+ 16 * y
< height
; i
++) {
327 memcpy(&src
[i
* stride
], &src_plane
[(i
+ 16 * y
) * src_stride
],
329 for (x
= width
; x
< 16 * block_width
; x
++)
330 src
[i
* stride
+ x
] = src
[i
* stride
+ x
- 1];
332 for (; i
< 16 && i
+ 16 * y
< 16 * block_height
; i
++)
333 memcpy(&src
[i
* stride
], &src
[(i
- 1) * stride
],
336 for (x
= 0; x
< block_width
; x
++) {
338 init_block_index(&s
->m
);
340 ff_estimate_p_frame_motion(&s
->m
, x
, y
);
342 s
->m
.first_slice_line
= 0;
345 ff_fix_long_p_mvs(&s
->m
);
346 ff_fix_long_mvs(&s
->m
, NULL
, 0, s
->m
.p_mv_table
, s
->m
.f_code
,
347 CANDIDATE_MB_TYPE_INTER
, 0);
350 s
->m
.first_slice_line
= 1;
351 for (y
= 0; y
< block_height
; y
++) {
352 for (i
= 0; i
< 16 && i
+ 16 * y
< height
; i
++) {
353 memcpy(&src
[i
* stride
], &src_plane
[(i
+ 16 * y
) * src_stride
],
355 for (x
= width
; x
< 16 * block_width
; x
++)
356 src
[i
* stride
+ x
] = src
[i
* stride
+ x
- 1];
358 for (; i
< 16 && i
+ 16 * y
< 16 * block_height
; i
++)
359 memcpy(&src
[i
* stride
], &src
[(i
- 1) * stride
], 16 * block_width
);
362 for (x
= 0; x
< block_width
; x
++) {
363 uint8_t reorder_buffer
[2][6][7 * 32];
365 int offset
= y
* 16 * stride
+ x
* 16;
366 uint8_t *decoded
= decoded_plane
+ offset
;
367 uint8_t *ref
= ref_plane
+ offset
;
368 int score
[4] = { 0, 0, 0, 0 }, best
;
369 uint8_t *temp
= s
->scratchbuf
;
371 if (s
->pb
.buf_end
- s
->pb
.buf
-
372 (put_bits_count(&s
->pb
) >> 3) < 3000) { // FIXME: check size
373 av_log(s
->avctx
, AV_LOG_ERROR
, "encoded frame too large\n");
378 init_block_index(&s
->m
);
380 if (f
->pict_type
== AV_PICTURE_TYPE_I
||
381 (s
->m
.mb_type
[x
+ y
* s
->m
.mb_stride
] &
382 CANDIDATE_MB_TYPE_INTRA
)) {
383 for (i
= 0; i
< 6; i
++)
384 init_put_bits(&s
->reorder_pb
[i
], reorder_buffer
[0][i
],
386 if (f
->pict_type
== AV_PICTURE_TYPE_P
) {
387 const uint8_t *vlc
= ff_svq1_block_type_vlc
[SVQ1_BLOCK_INTRA
];
388 put_bits(&s
->reorder_pb
[5], vlc
[1], vlc
[0]);
389 score
[0] = vlc
[1] * lambda
;
391 score
[0] += encode_block(s
, src
+ 16 * x
, NULL
, temp
, stride
,
393 for (i
= 0; i
< 6; i
++) {
394 count
[0][i
] = put_bits_count(&s
->reorder_pb
[i
]);
395 flush_put_bits(&s
->reorder_pb
[i
]);
402 if (f
->pict_type
== AV_PICTURE_TYPE_P
) {
403 const uint8_t *vlc
= ff_svq1_block_type_vlc
[SVQ1_BLOCK_INTER
];
404 int mx
, my
, pred_x
, pred_y
, dxy
;
407 motion_ptr
= ff_h263_pred_motion(&s
->m
, 0, 0, &pred_x
, &pred_y
);
408 if (s
->m
.mb_type
[x
+ y
* s
->m
.mb_stride
] &
409 CANDIDATE_MB_TYPE_INTER
) {
410 for (i
= 0; i
< 6; i
++)
411 init_put_bits(&s
->reorder_pb
[i
], reorder_buffer
[1][i
],
414 put_bits(&s
->reorder_pb
[5], vlc
[1], vlc
[0]);
416 s
->m
.pb
= s
->reorder_pb
[5];
419 av_assert1(mx
>= -32 && mx
<= 31);
420 av_assert1(my
>= -32 && my
<= 31);
421 av_assert1(pred_x
>= -32 && pred_x
<= 31);
422 av_assert1(pred_y
>= -32 && pred_y
<= 31);
423 ff_h263_encode_motion(&s
->m
, mx
- pred_x
, 1);
424 ff_h263_encode_motion(&s
->m
, my
- pred_y
, 1);
425 s
->reorder_pb
[5] = s
->m
.pb
;
426 score
[1] += lambda
* put_bits_count(&s
->reorder_pb
[5]);
428 dxy
= (mx
& 1) + 2 * (my
& 1);
430 s
->hdsp
.put_pixels_tab
[0][dxy
](temp
+ 16*stride
,
435 score
[1] += encode_block(s
, src
+ 16 * x
, temp
+ 16*stride
,
436 decoded
, stride
, 5, 64, lambda
, 0);
437 best
= score
[1] <= score
[0];
439 vlc
= ff_svq1_block_type_vlc
[SVQ1_BLOCK_SKIP
];
440 score
[2] = s
->mecc
.sse
[0](NULL
, src
+ 16 * x
, ref
,
442 score
[2] += vlc
[1] * lambda
;
443 if (score
[2] < score
[best
] && mx
== 0 && my
== 0) {
445 s
->hdsp
.put_pixels_tab
[0][0](decoded
, ref
, stride
, 16);
446 put_bits(&s
->pb
, vlc
[1], vlc
[0]);
451 for (i
= 0; i
< 6; i
++) {
452 count
[1][i
] = put_bits_count(&s
->reorder_pb
[i
]);
453 flush_put_bits(&s
->reorder_pb
[i
]);
460 motion_ptr
[0 + 2 * s
->m
.b8_stride
] =
461 motion_ptr
[1 + 2 * s
->m
.b8_stride
] =
462 motion_ptr
[2 + 2 * s
->m
.b8_stride
] =
463 motion_ptr
[3 + 2 * s
->m
.b8_stride
] = 0;
467 s
->rd_total
+= score
[best
];
470 for (i
= 5; i
>= 0; i
--)
471 avpriv_copy_bits(&s
->pb
, reorder_buffer
[best
][i
],
474 s
->hdsp
.put_pixels_tab
[0][0](decoded
, temp
, stride
, 16);
476 s
->m
.first_slice_line
= 0;
481 static av_cold
int svq1_encode_end(AVCodecContext
*avctx
)
483 SVQ1EncContext
*const s
= avctx
->priv_data
;
486 av_log(avctx
, AV_LOG_DEBUG
, "RD: %f\n",
487 s
->rd_total
/ (double)(avctx
->width
* avctx
->height
*
488 avctx
->frame_number
));
491 ff_mpv_common_end(&s
->m
);
493 av_freep(&s
->m
.me
.scratchpad
);
494 av_freep(&s
->m
.me
.map
);
495 av_freep(&s
->m
.me
.score_map
);
496 av_freep(&s
->mb_type
);
498 av_freep(&s
->scratchbuf
);
500 for (i
= 0; i
< 3; i
++) {
501 av_freep(&s
->motion_val8
[i
]);
502 av_freep(&s
->motion_val16
[i
]);
505 av_frame_free(&s
->current_picture
);
506 av_frame_free(&s
->last_picture
);
507 av_frame_free(&avctx
->coded_frame
);
512 static av_cold
int svq1_encode_init(AVCodecContext
*avctx
)
514 SVQ1EncContext
*const s
= avctx
->priv_data
;
517 ff_hpeldsp_init(&s
->hdsp
, avctx
->flags
);
518 ff_me_cmp_init(&s
->mecc
, avctx
);
519 ff_mpegvideoencdsp_init(&s
->m
.mpvencdsp
, avctx
);
521 avctx
->coded_frame
= av_frame_alloc();
522 s
->current_picture
= av_frame_alloc();
523 s
->last_picture
= av_frame_alloc();
524 if (!avctx
->coded_frame
|| !s
->current_picture
|| !s
->last_picture
) {
525 svq1_encode_end(avctx
);
526 return AVERROR(ENOMEM
);
529 s
->frame_width
= avctx
->width
;
530 s
->frame_height
= avctx
->height
;
532 s
->y_block_width
= (s
->frame_width
+ 15) / 16;
533 s
->y_block_height
= (s
->frame_height
+ 15) / 16;
535 s
->c_block_width
= (s
->frame_width
/ 4 + 15) / 16;
536 s
->c_block_height
= (s
->frame_height
/ 4 + 15) / 16;
541 if ((ret
= ff_mpv_common_init(&s
->m
)) < 0) {
542 svq1_encode_end(avctx
);
546 s
->m
.picture_structure
= PICT_FRAME
;
548 s
->m
.me
.scratchpad
= av_mallocz((avctx
->width
+ 64) *
549 2 * 16 * 2 * sizeof(uint8_t));
550 s
->m
.me
.map
= av_mallocz(ME_MAP_SIZE
* sizeof(uint32_t));
551 s
->m
.me
.score_map
= av_mallocz(ME_MAP_SIZE
* sizeof(uint32_t));
552 s
->mb_type
= av_mallocz((s
->y_block_width
+ 1) *
553 s
->y_block_height
* sizeof(int16_t));
554 s
->dummy
= av_mallocz((s
->y_block_width
+ 1) *
555 s
->y_block_height
* sizeof(int32_t));
556 s
->ssd_int8_vs_int16
= ssd_int8_vs_int16_c
;
559 ff_svq1enc_init_ppc(s
);
561 ff_svq1enc_init_x86(s
);
563 ff_h263_encode_init(&s
->m
); // mv_penalty
568 static int svq1_encode_frame(AVCodecContext
*avctx
, AVPacket
*pkt
,
569 const AVFrame
*pict
, int *got_packet
)
571 SVQ1EncContext
*const s
= avctx
->priv_data
;
572 AVFrame
*const p
= avctx
->coded_frame
;
575 if ((ret
= ff_alloc_packet2(avctx
, pkt
, s
->y_block_width
* s
->y_block_height
*
576 MAX_MB_BYTES
*3 + FF_MIN_BUFFER_SIZE
)) < 0)
579 if (avctx
->pix_fmt
!= AV_PIX_FMT_YUV410P
) {
580 av_log(avctx
, AV_LOG_ERROR
, "unsupported pixel format\n");
584 if (!s
->current_picture
->data
[0]) {
585 if ((ret
= ff_get_buffer(avctx
, s
->current_picture
, 0))< 0 ||
586 (ret
= ff_get_buffer(avctx
, s
->last_picture
, 0)) < 0) {
589 s
->scratchbuf
= av_malloc(s
->current_picture
->linesize
[0] * 16 * 3);
592 FFSWAP(AVFrame
*, s
->current_picture
, s
->last_picture
);
594 init_put_bits(&s
->pb
, pkt
->data
, pkt
->size
);
596 p
->pict_type
= avctx
->gop_size
&& avctx
->frame_number
% avctx
->gop_size
?
597 AV_PICTURE_TYPE_P
: AV_PICTURE_TYPE_I
;
598 p
->key_frame
= p
->pict_type
== AV_PICTURE_TYPE_I
;
599 p
->quality
= pict
->quality
;
601 svq1_write_header(s
, p
->pict_type
);
602 for (i
= 0; i
< 3; i
++)
603 if (svq1_encode_plane(s
, i
,
605 s
->last_picture
->data
[i
],
606 s
->current_picture
->data
[i
],
607 s
->frame_width
/ (i
? 4 : 1),
608 s
->frame_height
/ (i
? 4 : 1),
610 s
->current_picture
->linesize
[i
]) < 0)
613 // avpriv_align_put_bits(&s->pb);
614 while (put_bits_count(&s
->pb
) & 31)
615 put_bits(&s
->pb
, 1, 0);
617 flush_put_bits(&s
->pb
);
619 pkt
->size
= put_bits_count(&s
->pb
) / 8;
620 if (p
->pict_type
== AV_PICTURE_TYPE_I
)
621 pkt
->flags
|= AV_PKT_FLAG_KEY
;
627 AVCodec ff_svq1_encoder
= {
629 .long_name
= NULL_IF_CONFIG_SMALL("Sorenson Vector Quantizer 1 / Sorenson Video 1 / SVQ1"),
630 .type
= AVMEDIA_TYPE_VIDEO
,
631 .id
= AV_CODEC_ID_SVQ1
,
632 .priv_data_size
= sizeof(SVQ1EncContext
),
633 .init
= svq1_encode_init
,
634 .encode2
= svq1_encode_frame
,
635 .close
= svq1_encode_end
,
636 .pix_fmts
= (const enum AVPixelFormat
[]) { AV_PIX_FMT_YUV410P
,