annotate ffmpeg/libavcodec/mjpegenc.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
yading@10 1 /*
yading@10 2 * MJPEG encoder
yading@10 3 * Copyright (c) 2000, 2001 Fabrice Bellard
yading@10 4 * Copyright (c) 2003 Alex Beregszaszi
yading@10 5 * Copyright (c) 2003-2004 Michael Niedermayer
yading@10 6 *
yading@10 7 * Support for external huffman table, various fixes (AVID workaround),
yading@10 8 * aspecting, new decode_frame mechanism and apple mjpeg-b support
yading@10 9 * by Alex Beregszaszi
yading@10 10 *
yading@10 11 * This file is part of FFmpeg.
yading@10 12 *
yading@10 13 * FFmpeg is free software; you can redistribute it and/or
yading@10 14 * modify it under the terms of the GNU Lesser General Public
yading@10 15 * License as published by the Free Software Foundation; either
yading@10 16 * version 2.1 of the License, or (at your option) any later version.
yading@10 17 *
yading@10 18 * FFmpeg is distributed in the hope that it will be useful,
yading@10 19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 21 * Lesser General Public License for more details.
yading@10 22 *
yading@10 23 * You should have received a copy of the GNU Lesser General Public
yading@10 24 * License along with FFmpeg; if not, write to the Free Software
yading@10 25 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 26 */
yading@10 27
yading@10 28 /**
yading@10 29 * @file
yading@10 30 * MJPEG encoder.
yading@10 31 */
yading@10 32
yading@10 33 #include "avcodec.h"
yading@10 34 #include "mpegvideo.h"
yading@10 35 #include "mjpeg.h"
yading@10 36 #include "mjpegenc.h"
yading@10 37
yading@10 38 /* use two quantizer tables (one for luminance and one for chrominance) */
yading@10 39 /* not yet working */
yading@10 40 #undef TWOMATRIXES
yading@10 41
yading@10 42
yading@10 43 av_cold int ff_mjpeg_encode_init(MpegEncContext *s)
yading@10 44 {
yading@10 45 MJpegContext *m;
yading@10 46
yading@10 47 if (s->width > 65500 || s->height > 65500) {
yading@10 48 av_log(s, AV_LOG_ERROR, "JPEG does not support resolutions above 65500x65500\n");
yading@10 49 return -1;
yading@10 50 }
yading@10 51
yading@10 52 m = av_malloc(sizeof(MJpegContext));
yading@10 53 if (!m)
yading@10 54 return -1;
yading@10 55
yading@10 56 s->min_qcoeff=-1023;
yading@10 57 s->max_qcoeff= 1023;
yading@10 58
yading@10 59 /* build all the huffman tables */
yading@10 60 ff_mjpeg_build_huffman_codes(m->huff_size_dc_luminance,
yading@10 61 m->huff_code_dc_luminance,
yading@10 62 avpriv_mjpeg_bits_dc_luminance,
yading@10 63 avpriv_mjpeg_val_dc);
yading@10 64 ff_mjpeg_build_huffman_codes(m->huff_size_dc_chrominance,
yading@10 65 m->huff_code_dc_chrominance,
yading@10 66 avpriv_mjpeg_bits_dc_chrominance,
yading@10 67 avpriv_mjpeg_val_dc);
yading@10 68 ff_mjpeg_build_huffman_codes(m->huff_size_ac_luminance,
yading@10 69 m->huff_code_ac_luminance,
yading@10 70 avpriv_mjpeg_bits_ac_luminance,
yading@10 71 avpriv_mjpeg_val_ac_luminance);
yading@10 72 ff_mjpeg_build_huffman_codes(m->huff_size_ac_chrominance,
yading@10 73 m->huff_code_ac_chrominance,
yading@10 74 avpriv_mjpeg_bits_ac_chrominance,
yading@10 75 avpriv_mjpeg_val_ac_chrominance);
yading@10 76
yading@10 77 s->mjpeg_ctx = m;
yading@10 78 return 0;
yading@10 79 }
yading@10 80
yading@10 81 void ff_mjpeg_encode_close(MpegEncContext *s)
yading@10 82 {
yading@10 83 av_free(s->mjpeg_ctx);
yading@10 84 }
yading@10 85
yading@10 86 /* table_class: 0 = DC coef, 1 = AC coefs */
yading@10 87 static int put_huffman_table(MpegEncContext *s, int table_class, int table_id,
yading@10 88 const uint8_t *bits_table, const uint8_t *value_table)
yading@10 89 {
yading@10 90 PutBitContext *p = &s->pb;
yading@10 91 int n, i;
yading@10 92
yading@10 93 put_bits(p, 4, table_class);
yading@10 94 put_bits(p, 4, table_id);
yading@10 95
yading@10 96 n = 0;
yading@10 97 for(i=1;i<=16;i++) {
yading@10 98 n += bits_table[i];
yading@10 99 put_bits(p, 8, bits_table[i]);
yading@10 100 }
yading@10 101
yading@10 102 for(i=0;i<n;i++)
yading@10 103 put_bits(p, 8, value_table[i]);
yading@10 104
yading@10 105 return n + 17;
yading@10 106 }
yading@10 107
yading@10 108 static void jpeg_table_header(MpegEncContext *s)
yading@10 109 {
yading@10 110 PutBitContext *p = &s->pb;
yading@10 111 int i, j, size;
yading@10 112 uint8_t *ptr;
yading@10 113
yading@10 114 /* quant matrixes */
yading@10 115 put_marker(p, DQT);
yading@10 116 #ifdef TWOMATRIXES
yading@10 117 put_bits(p, 16, 2 + 2 * (1 + 64));
yading@10 118 #else
yading@10 119 put_bits(p, 16, 2 + 1 * (1 + 64));
yading@10 120 #endif
yading@10 121 put_bits(p, 4, 0); /* 8 bit precision */
yading@10 122 put_bits(p, 4, 0); /* table 0 */
yading@10 123 for(i=0;i<64;i++) {
yading@10 124 j = s->intra_scantable.permutated[i];
yading@10 125 put_bits(p, 8, s->intra_matrix[j]);
yading@10 126 }
yading@10 127 #ifdef TWOMATRIXES
yading@10 128 put_bits(p, 4, 0); /* 8 bit precision */
yading@10 129 put_bits(p, 4, 1); /* table 1 */
yading@10 130 for(i=0;i<64;i++) {
yading@10 131 j = s->intra_scantable.permutated[i];
yading@10 132 put_bits(p, 8, s->chroma_intra_matrix[j]);
yading@10 133 }
yading@10 134 #endif
yading@10 135
yading@10 136 if(s->avctx->active_thread_type & FF_THREAD_SLICE){
yading@10 137 put_marker(p, DRI);
yading@10 138 put_bits(p, 16, 4);
yading@10 139 put_bits(p, 16, (s->width-1)/(8*s->mjpeg_hsample[0]) + 1);
yading@10 140 }
yading@10 141
yading@10 142 /* huffman table */
yading@10 143 put_marker(p, DHT);
yading@10 144 flush_put_bits(p);
yading@10 145 ptr = put_bits_ptr(p);
yading@10 146 put_bits(p, 16, 0); /* patched later */
yading@10 147 size = 2;
yading@10 148 size += put_huffman_table(s, 0, 0, avpriv_mjpeg_bits_dc_luminance,
yading@10 149 avpriv_mjpeg_val_dc);
yading@10 150 size += put_huffman_table(s, 0, 1, avpriv_mjpeg_bits_dc_chrominance,
yading@10 151 avpriv_mjpeg_val_dc);
yading@10 152
yading@10 153 size += put_huffman_table(s, 1, 0, avpriv_mjpeg_bits_ac_luminance,
yading@10 154 avpriv_mjpeg_val_ac_luminance);
yading@10 155 size += put_huffman_table(s, 1, 1, avpriv_mjpeg_bits_ac_chrominance,
yading@10 156 avpriv_mjpeg_val_ac_chrominance);
yading@10 157 AV_WB16(ptr, size);
yading@10 158 }
yading@10 159
yading@10 160 static void jpeg_put_comments(MpegEncContext *s)
yading@10 161 {
yading@10 162 PutBitContext *p = &s->pb;
yading@10 163 int size;
yading@10 164 uint8_t *ptr;
yading@10 165
yading@10 166 if (s->avctx->sample_aspect_ratio.num /* && !lossless */)
yading@10 167 {
yading@10 168 /* JFIF header */
yading@10 169 put_marker(p, APP0);
yading@10 170 put_bits(p, 16, 16);
yading@10 171 avpriv_put_string(p, "JFIF", 1); /* this puts the trailing zero-byte too */
yading@10 172 put_bits(p, 16, 0x0102); /* v 1.02 */
yading@10 173 put_bits(p, 8, 0); /* units type: 0 - aspect ratio */
yading@10 174 put_bits(p, 16, s->avctx->sample_aspect_ratio.num);
yading@10 175 put_bits(p, 16, s->avctx->sample_aspect_ratio.den);
yading@10 176 put_bits(p, 8, 0); /* thumbnail width */
yading@10 177 put_bits(p, 8, 0); /* thumbnail height */
yading@10 178 }
yading@10 179
yading@10 180 /* comment */
yading@10 181 if(!(s->flags & CODEC_FLAG_BITEXACT)){
yading@10 182 put_marker(p, COM);
yading@10 183 flush_put_bits(p);
yading@10 184 ptr = put_bits_ptr(p);
yading@10 185 put_bits(p, 16, 0); /* patched later */
yading@10 186 avpriv_put_string(p, LIBAVCODEC_IDENT, 1);
yading@10 187 size = strlen(LIBAVCODEC_IDENT)+3;
yading@10 188 AV_WB16(ptr, size);
yading@10 189 }
yading@10 190
yading@10 191 if( s->avctx->pix_fmt == AV_PIX_FMT_YUV420P
yading@10 192 ||s->avctx->pix_fmt == AV_PIX_FMT_YUV422P
yading@10 193 ||s->avctx->pix_fmt == AV_PIX_FMT_YUV444P){
yading@10 194 put_marker(p, COM);
yading@10 195 flush_put_bits(p);
yading@10 196 ptr = put_bits_ptr(p);
yading@10 197 put_bits(p, 16, 0); /* patched later */
yading@10 198 avpriv_put_string(p, "CS=ITU601", 1);
yading@10 199 size = strlen("CS=ITU601")+3;
yading@10 200 AV_WB16(ptr, size);
yading@10 201 }
yading@10 202 }
yading@10 203
yading@10 204 void ff_mjpeg_encode_picture_header(MpegEncContext *s)
yading@10 205 {
yading@10 206 const int lossless= s->avctx->codec_id != AV_CODEC_ID_MJPEG;
yading@10 207 int i;
yading@10 208
yading@10 209 put_marker(&s->pb, SOI);
yading@10 210
yading@10 211 // hack for AMV mjpeg format
yading@10 212 if(s->avctx->codec_id == AV_CODEC_ID_AMV) goto end;
yading@10 213
yading@10 214 jpeg_put_comments(s);
yading@10 215
yading@10 216 jpeg_table_header(s);
yading@10 217
yading@10 218 switch(s->avctx->codec_id){
yading@10 219 case AV_CODEC_ID_MJPEG: put_marker(&s->pb, SOF0 ); break;
yading@10 220 case AV_CODEC_ID_LJPEG: put_marker(&s->pb, SOF3 ); break;
yading@10 221 default: av_assert0(0);
yading@10 222 }
yading@10 223
yading@10 224 put_bits(&s->pb, 16, 17);
yading@10 225 if(lossless && (s->avctx->pix_fmt == AV_PIX_FMT_BGR0
yading@10 226 || s->avctx->pix_fmt == AV_PIX_FMT_BGRA
yading@10 227 || s->avctx->pix_fmt == AV_PIX_FMT_BGR24))
yading@10 228 put_bits(&s->pb, 8, 9); /* 9 bits/component RCT */
yading@10 229 else
yading@10 230 put_bits(&s->pb, 8, 8); /* 8 bits/component */
yading@10 231 put_bits(&s->pb, 16, s->height);
yading@10 232 put_bits(&s->pb, 16, s->width);
yading@10 233 put_bits(&s->pb, 8, 3); /* 3 components */
yading@10 234
yading@10 235 /* Y component */
yading@10 236 put_bits(&s->pb, 8, 1); /* component number */
yading@10 237 put_bits(&s->pb, 4, s->mjpeg_hsample[0]); /* H factor */
yading@10 238 put_bits(&s->pb, 4, s->mjpeg_vsample[0]); /* V factor */
yading@10 239 put_bits(&s->pb, 8, 0); /* select matrix */
yading@10 240
yading@10 241 /* Cb component */
yading@10 242 put_bits(&s->pb, 8, 2); /* component number */
yading@10 243 put_bits(&s->pb, 4, s->mjpeg_hsample[1]); /* H factor */
yading@10 244 put_bits(&s->pb, 4, s->mjpeg_vsample[1]); /* V factor */
yading@10 245 #ifdef TWOMATRIXES
yading@10 246 put_bits(&s->pb, 8, lossless ? 0 : 1); /* select matrix */
yading@10 247 #else
yading@10 248 put_bits(&s->pb, 8, 0); /* select matrix */
yading@10 249 #endif
yading@10 250
yading@10 251 /* Cr component */
yading@10 252 put_bits(&s->pb, 8, 3); /* component number */
yading@10 253 put_bits(&s->pb, 4, s->mjpeg_hsample[2]); /* H factor */
yading@10 254 put_bits(&s->pb, 4, s->mjpeg_vsample[2]); /* V factor */
yading@10 255 #ifdef TWOMATRIXES
yading@10 256 put_bits(&s->pb, 8, lossless ? 0 : 1); /* select matrix */
yading@10 257 #else
yading@10 258 put_bits(&s->pb, 8, 0); /* select matrix */
yading@10 259 #endif
yading@10 260
yading@10 261 /* scan header */
yading@10 262 put_marker(&s->pb, SOS);
yading@10 263 put_bits(&s->pb, 16, 12); /* length */
yading@10 264 put_bits(&s->pb, 8, 3); /* 3 components */
yading@10 265
yading@10 266 /* Y component */
yading@10 267 put_bits(&s->pb, 8, 1); /* index */
yading@10 268 put_bits(&s->pb, 4, 0); /* DC huffman table index */
yading@10 269 put_bits(&s->pb, 4, 0); /* AC huffman table index */
yading@10 270
yading@10 271 /* Cb component */
yading@10 272 put_bits(&s->pb, 8, 2); /* index */
yading@10 273 put_bits(&s->pb, 4, 1); /* DC huffman table index */
yading@10 274 put_bits(&s->pb, 4, lossless ? 0 : 1); /* AC huffman table index */
yading@10 275
yading@10 276 /* Cr component */
yading@10 277 put_bits(&s->pb, 8, 3); /* index */
yading@10 278 put_bits(&s->pb, 4, 1); /* DC huffman table index */
yading@10 279 put_bits(&s->pb, 4, lossless ? 0 : 1); /* AC huffman table index */
yading@10 280
yading@10 281 put_bits(&s->pb, 8, lossless ? s->avctx->prediction_method+1 : 0); /* Ss (not used) */
yading@10 282
yading@10 283 switch(s->avctx->codec_id){
yading@10 284 case AV_CODEC_ID_MJPEG: put_bits(&s->pb, 8, 63); break; /* Se (not used) */
yading@10 285 case AV_CODEC_ID_LJPEG: put_bits(&s->pb, 8, 0); break; /* not used */
yading@10 286 default: av_assert0(0);
yading@10 287 }
yading@10 288
yading@10 289 put_bits(&s->pb, 8, 0); /* Ah/Al (not used) */
yading@10 290
yading@10 291 end:
yading@10 292 s->esc_pos = put_bits_count(&s->pb) >> 3;
yading@10 293 for(i=1; i<s->slice_context_count; i++)
yading@10 294 s->thread_context[i]->esc_pos = 0;
yading@10 295 }
yading@10 296
yading@10 297 static void escape_FF(MpegEncContext *s, int start)
yading@10 298 {
yading@10 299 int size= put_bits_count(&s->pb) - start*8;
yading@10 300 int i, ff_count;
yading@10 301 uint8_t *buf= s->pb.buf + start;
yading@10 302 int align= (-(size_t)(buf))&3;
yading@10 303
yading@10 304 av_assert1((size&7) == 0);
yading@10 305 size >>= 3;
yading@10 306
yading@10 307 ff_count=0;
yading@10 308 for(i=0; i<size && i<align; i++){
yading@10 309 if(buf[i]==0xFF) ff_count++;
yading@10 310 }
yading@10 311 for(; i<size-15; i+=16){
yading@10 312 int acc, v;
yading@10 313
yading@10 314 v= *(uint32_t*)(&buf[i]);
yading@10 315 acc= (((v & (v>>4))&0x0F0F0F0F)+0x01010101)&0x10101010;
yading@10 316 v= *(uint32_t*)(&buf[i+4]);
yading@10 317 acc+=(((v & (v>>4))&0x0F0F0F0F)+0x01010101)&0x10101010;
yading@10 318 v= *(uint32_t*)(&buf[i+8]);
yading@10 319 acc+=(((v & (v>>4))&0x0F0F0F0F)+0x01010101)&0x10101010;
yading@10 320 v= *(uint32_t*)(&buf[i+12]);
yading@10 321 acc+=(((v & (v>>4))&0x0F0F0F0F)+0x01010101)&0x10101010;
yading@10 322
yading@10 323 acc>>=4;
yading@10 324 acc+= (acc>>16);
yading@10 325 acc+= (acc>>8);
yading@10 326 ff_count+= acc&0xFF;
yading@10 327 }
yading@10 328 for(; i<size; i++){
yading@10 329 if(buf[i]==0xFF) ff_count++;
yading@10 330 }
yading@10 331
yading@10 332 if(ff_count==0) return;
yading@10 333
yading@10 334 flush_put_bits(&s->pb);
yading@10 335 skip_put_bytes(&s->pb, ff_count);
yading@10 336
yading@10 337 for(i=size-1; ff_count; i--){
yading@10 338 int v= buf[i];
yading@10 339
yading@10 340 if(v==0xFF){
yading@10 341 buf[i+ff_count]= 0;
yading@10 342 ff_count--;
yading@10 343 }
yading@10 344
yading@10 345 buf[i+ff_count]= v;
yading@10 346 }
yading@10 347 }
yading@10 348
yading@10 349 void ff_mjpeg_encode_stuffing(MpegEncContext *s)
yading@10 350 {
yading@10 351 int length, i;
yading@10 352 PutBitContext *pbc = &s->pb;
yading@10 353 int mb_y = s->mb_y - !s->mb_x;
yading@10 354 length= (-put_bits_count(pbc))&7;
yading@10 355 if(length) put_bits(pbc, length, (1<<length)-1);
yading@10 356
yading@10 357 flush_put_bits(&s->pb);
yading@10 358 escape_FF(s, s->esc_pos);
yading@10 359
yading@10 360 if((s->avctx->active_thread_type & FF_THREAD_SLICE) && mb_y < s->mb_height)
yading@10 361 put_marker(pbc, RST0 + (mb_y&7));
yading@10 362 s->esc_pos = put_bits_count(pbc) >> 3;
yading@10 363
yading@10 364 for(i=0; i<3; i++)
yading@10 365 s->last_dc[i] = 128 << s->intra_dc_precision;
yading@10 366 }
yading@10 367
yading@10 368 void ff_mjpeg_encode_picture_trailer(MpegEncContext *s)
yading@10 369 {
yading@10 370
yading@10 371 av_assert1((s->header_bits&7)==0);
yading@10 372
yading@10 373
yading@10 374 put_marker(&s->pb, EOI);
yading@10 375 }
yading@10 376
yading@10 377 void ff_mjpeg_encode_dc(MpegEncContext *s, int val,
yading@10 378 uint8_t *huff_size, uint16_t *huff_code)
yading@10 379 {
yading@10 380 int mant, nbits;
yading@10 381
yading@10 382 if (val == 0) {
yading@10 383 put_bits(&s->pb, huff_size[0], huff_code[0]);
yading@10 384 } else {
yading@10 385 mant = val;
yading@10 386 if (val < 0) {
yading@10 387 val = -val;
yading@10 388 mant--;
yading@10 389 }
yading@10 390
yading@10 391 nbits= av_log2_16bit(val) + 1;
yading@10 392
yading@10 393 put_bits(&s->pb, huff_size[nbits], huff_code[nbits]);
yading@10 394
yading@10 395 put_sbits(&s->pb, nbits, mant);
yading@10 396 }
yading@10 397 }
yading@10 398
yading@10 399 static void encode_block(MpegEncContext *s, int16_t *block, int n)
yading@10 400 {
yading@10 401 int mant, nbits, code, i, j;
yading@10 402 int component, dc, run, last_index, val;
yading@10 403 MJpegContext *m = s->mjpeg_ctx;
yading@10 404 uint8_t *huff_size_ac;
yading@10 405 uint16_t *huff_code_ac;
yading@10 406
yading@10 407 /* DC coef */
yading@10 408 component = (n <= 3 ? 0 : (n&1) + 1);
yading@10 409 dc = block[0]; /* overflow is impossible */
yading@10 410 val = dc - s->last_dc[component];
yading@10 411 if (n < 4) {
yading@10 412 ff_mjpeg_encode_dc(s, val, m->huff_size_dc_luminance, m->huff_code_dc_luminance);
yading@10 413 huff_size_ac = m->huff_size_ac_luminance;
yading@10 414 huff_code_ac = m->huff_code_ac_luminance;
yading@10 415 } else {
yading@10 416 ff_mjpeg_encode_dc(s, val, m->huff_size_dc_chrominance, m->huff_code_dc_chrominance);
yading@10 417 huff_size_ac = m->huff_size_ac_chrominance;
yading@10 418 huff_code_ac = m->huff_code_ac_chrominance;
yading@10 419 }
yading@10 420 s->last_dc[component] = dc;
yading@10 421
yading@10 422 /* AC coefs */
yading@10 423
yading@10 424 run = 0;
yading@10 425 last_index = s->block_last_index[n];
yading@10 426 for(i=1;i<=last_index;i++) {
yading@10 427 j = s->intra_scantable.permutated[i];
yading@10 428 val = block[j];
yading@10 429 if (val == 0) {
yading@10 430 run++;
yading@10 431 } else {
yading@10 432 while (run >= 16) {
yading@10 433 put_bits(&s->pb, huff_size_ac[0xf0], huff_code_ac[0xf0]);
yading@10 434 run -= 16;
yading@10 435 }
yading@10 436 mant = val;
yading@10 437 if (val < 0) {
yading@10 438 val = -val;
yading@10 439 mant--;
yading@10 440 }
yading@10 441
yading@10 442 nbits= av_log2(val) + 1;
yading@10 443 code = (run << 4) | nbits;
yading@10 444
yading@10 445 put_bits(&s->pb, huff_size_ac[code], huff_code_ac[code]);
yading@10 446
yading@10 447 put_sbits(&s->pb, nbits, mant);
yading@10 448 run = 0;
yading@10 449 }
yading@10 450 }
yading@10 451
yading@10 452 /* output EOB only if not already 64 values */
yading@10 453 if (last_index < 63 || run != 0)
yading@10 454 put_bits(&s->pb, huff_size_ac[0], huff_code_ac[0]);
yading@10 455 }
yading@10 456
yading@10 457 void ff_mjpeg_encode_mb(MpegEncContext *s, int16_t block[6][64])
yading@10 458 {
yading@10 459 int i;
yading@10 460 if (s->chroma_format == CHROMA_444) {
yading@10 461 encode_block(s, block[0], 0);
yading@10 462 encode_block(s, block[2], 2);
yading@10 463 encode_block(s, block[4], 4);
yading@10 464 encode_block(s, block[8], 8);
yading@10 465 encode_block(s, block[5], 5);
yading@10 466 encode_block(s, block[9], 9);
yading@10 467
yading@10 468 if (16*s->mb_x+8 < s->width) {
yading@10 469 encode_block(s, block[1], 1);
yading@10 470 encode_block(s, block[3], 3);
yading@10 471 encode_block(s, block[6], 6);
yading@10 472 encode_block(s, block[10], 10);
yading@10 473 encode_block(s, block[7], 7);
yading@10 474 encode_block(s, block[11], 11);
yading@10 475 }
yading@10 476 } else {
yading@10 477 for(i=0;i<5;i++) {
yading@10 478 encode_block(s, block[i], i);
yading@10 479 }
yading@10 480 if (s->chroma_format == CHROMA_420) {
yading@10 481 encode_block(s, block[5], 5);
yading@10 482 } else {
yading@10 483 encode_block(s, block[6], 6);
yading@10 484 encode_block(s, block[5], 5);
yading@10 485 encode_block(s, block[7], 7);
yading@10 486 }
yading@10 487 }
yading@10 488
yading@10 489 s->i_tex_bits += get_bits_diff(s);
yading@10 490 }
yading@10 491
yading@10 492 // maximum over s->mjpeg_vsample[i]
yading@10 493 #define V_MAX 2
yading@10 494 static int amv_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
yading@10 495 const AVFrame *pic_arg, int *got_packet)
yading@10 496
yading@10 497 {
yading@10 498 MpegEncContext *s = avctx->priv_data;
yading@10 499 AVFrame pic = *pic_arg;
yading@10 500 int i;
yading@10 501
yading@10 502 //CODEC_FLAG_EMU_EDGE have to be cleared
yading@10 503 if(s->avctx->flags & CODEC_FLAG_EMU_EDGE)
yading@10 504 return -1;
yading@10 505
yading@10 506 //picture should be flipped upside-down
yading@10 507 for(i=0; i < 3; i++) {
yading@10 508 pic.data[i] += (pic.linesize[i] * (s->mjpeg_vsample[i] * (8 * s->mb_height -((s->height/V_MAX)&7)) - 1 ));
yading@10 509 pic.linesize[i] *= -1;
yading@10 510 }
yading@10 511 return ff_MPV_encode_picture(avctx, pkt, &pic, got_packet);
yading@10 512 }
yading@10 513
yading@10 514 #if CONFIG_MJPEG_ENCODER
yading@10 515 AVCodec ff_mjpeg_encoder = {
yading@10 516 .name = "mjpeg",
yading@10 517 .type = AVMEDIA_TYPE_VIDEO,
yading@10 518 .id = AV_CODEC_ID_MJPEG,
yading@10 519 .priv_data_size = sizeof(MpegEncContext),
yading@10 520 .init = ff_MPV_encode_init,
yading@10 521 .encode2 = ff_MPV_encode_picture,
yading@10 522 .close = ff_MPV_encode_end,
yading@10 523 .capabilities = CODEC_CAP_SLICE_THREADS | CODEC_CAP_FRAME_THREADS | CODEC_CAP_INTRA_ONLY,
yading@10 524 .pix_fmts = (const enum AVPixelFormat[]){
yading@10 525 AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_NONE
yading@10 526 },
yading@10 527 .long_name = NULL_IF_CONFIG_SMALL("MJPEG (Motion JPEG)"),
yading@10 528 };
yading@10 529 #endif
yading@10 530 #if CONFIG_AMV_ENCODER
yading@10 531 AVCodec ff_amv_encoder = {
yading@10 532 .name = "amv",
yading@10 533 .type = AVMEDIA_TYPE_VIDEO,
yading@10 534 .id = AV_CODEC_ID_AMV,
yading@10 535 .priv_data_size = sizeof(MpegEncContext),
yading@10 536 .init = ff_MPV_encode_init,
yading@10 537 .encode2 = amv_encode_picture,
yading@10 538 .close = ff_MPV_encode_end,
yading@10 539 .pix_fmts = (const enum AVPixelFormat[]){
yading@10 540 AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_NONE
yading@10 541 },
yading@10 542 .long_name = NULL_IF_CONFIG_SMALL("AMV Video"),
yading@10 543 };
yading@10 544 #endif