00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00029 #include "common.h"
00030 #include "bitstream.h"
00031 #include "avcodec.h"
00032 #include "dsputil.h"
00033
00034 #define VLC_BITS 11
00035
00036 #ifdef WORDS_BIGENDIAN
00037 #define B 3
00038 #define G 2
00039 #define R 1
00040 #else
00041 #define B 0
00042 #define G 1
00043 #define R 2
00044 #endif
00045
00046 typedef enum Predictor{
00047 LEFT= 0,
00048 PLANE,
00049 MEDIAN,
00050 } Predictor;
00051
00052 typedef struct HYuvContext{
00053 AVCodecContext *avctx;
00054 Predictor predictor;
00055 GetBitContext gb;
00056 PutBitContext pb;
00057 int interlaced;
00058 int decorrelate;
00059 int bitstream_bpp;
00060 int version;
00061 int yuy2;
00062 int bgr32;
00063 int width, height;
00064 int flags;
00065 int context;
00066 int picture_number;
00067 int last_slice_end;
00068 uint8_t *temp[3];
00069 uint64_t stats[3][256];
00070 uint8_t len[3][256];
00071 uint32_t bits[3][256];
00072 VLC vlc[3];
00073 AVFrame picture;
00074 uint8_t *bitstream_buffer;
00075 int bitstream_buffer_size;
00076 DSPContext dsp;
00077 }HYuvContext;
00078
00079 static const unsigned char classic_shift_luma[] = {
00080 34,36,35,69,135,232,9,16,10,24,11,23,12,16,13,10,14,8,15,8,
00081 16,8,17,20,16,10,207,206,205,236,11,8,10,21,9,23,8,8,199,70,
00082 69,68, 0
00083 };
00084
00085 static const unsigned char classic_shift_chroma[] = {
00086 66,36,37,38,39,40,41,75,76,77,110,239,144,81,82,83,84,85,118,183,
00087 56,57,88,89,56,89,154,57,58,57,26,141,57,56,58,57,58,57,184,119,
00088 214,245,116,83,82,49,80,79,78,77,44,75,41,40,39,38,37,36,34, 0
00089 };
00090
00091 static const unsigned char classic_add_luma[256] = {
00092 3, 9, 5, 12, 10, 35, 32, 29, 27, 50, 48, 45, 44, 41, 39, 37,
00093 73, 70, 68, 65, 64, 61, 58, 56, 53, 50, 49, 46, 44, 41, 38, 36,
00094 68, 65, 63, 61, 58, 55, 53, 51, 48, 46, 45, 43, 41, 39, 38, 36,
00095 35, 33, 32, 30, 29, 27, 26, 25, 48, 47, 46, 44, 43, 41, 40, 39,
00096 37, 36, 35, 34, 32, 31, 30, 28, 27, 26, 24, 23, 22, 20, 19, 37,
00097 35, 34, 33, 31, 30, 29, 27, 26, 24, 23, 21, 20, 18, 17, 15, 29,
00098 27, 26, 24, 22, 21, 19, 17, 16, 14, 26, 25, 23, 21, 19, 18, 16,
00099 15, 27, 25, 23, 21, 19, 17, 16, 14, 26, 25, 23, 21, 18, 17, 14,
00100 12, 17, 19, 13, 4, 9, 2, 11, 1, 7, 8, 0, 16, 3, 14, 6,
00101 12, 10, 5, 15, 18, 11, 10, 13, 15, 16, 19, 20, 22, 24, 27, 15,
00102 18, 20, 22, 24, 26, 14, 17, 20, 22, 24, 27, 15, 18, 20, 23, 25,
00103 28, 16, 19, 22, 25, 28, 32, 36, 21, 25, 29, 33, 38, 42, 45, 49,
00104 28, 31, 34, 37, 40, 42, 44, 47, 49, 50, 52, 54, 56, 57, 59, 60,
00105 62, 64, 66, 67, 69, 35, 37, 39, 40, 42, 43, 45, 47, 48, 51, 52,
00106 54, 55, 57, 59, 60, 62, 63, 66, 67, 69, 71, 72, 38, 40, 42, 43,
00107 46, 47, 49, 51, 26, 28, 30, 31, 33, 34, 18, 19, 11, 13, 7, 8,
00108 };
00109
00110 static const unsigned char classic_add_chroma[256] = {
00111 3, 1, 2, 2, 2, 2, 3, 3, 7, 5, 7, 5, 8, 6, 11, 9,
00112 7, 13, 11, 10, 9, 8, 7, 5, 9, 7, 6, 4, 7, 5, 8, 7,
00113 11, 8, 13, 11, 19, 15, 22, 23, 20, 33, 32, 28, 27, 29, 51, 77,
00114 43, 45, 76, 81, 46, 82, 75, 55, 56,144, 58, 80, 60, 74,147, 63,
00115 143, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
00116 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 27, 30, 21, 22,
00117 17, 14, 5, 6,100, 54, 47, 50, 51, 53,106,107,108,109,110,111,
00118 112,113,114,115, 4,117,118, 92, 94,121,122, 3,124,103, 2, 1,
00119 0,129,130,131,120,119,126,125,136,137,138,139,140,141,142,134,
00120 135,132,133,104, 64,101, 62, 57,102, 95, 93, 59, 61, 28, 97, 96,
00121 52, 49, 48, 29, 32, 25, 24, 46, 23, 98, 45, 44, 43, 20, 42, 41,
00122 19, 18, 99, 40, 15, 39, 38, 16, 13, 12, 11, 37, 10, 9, 8, 36,
00123 7,128,127,105,123,116, 35, 34, 33,145, 31, 79, 42,146, 78, 26,
00124 83, 48, 49, 50, 44, 47, 26, 31, 30, 18, 17, 19, 21, 24, 25, 13,
00125 14, 16, 17, 18, 20, 21, 12, 14, 15, 9, 10, 6, 9, 6, 5, 8,
00126 6, 12, 8, 10, 7, 9, 6, 4, 6, 2, 2, 3, 3, 3, 3, 2,
00127 };
00128
00129 static inline int add_left_prediction(uint8_t *dst, uint8_t *src, int w, int acc){
00130 int i;
00131
00132 for(i=0; i<w-1; i++){
00133 acc+= src[i];
00134 dst[i]= acc;
00135 i++;
00136 acc+= src[i];
00137 dst[i]= acc;
00138 }
00139
00140 for(; i<w; i++){
00141 acc+= src[i];
00142 dst[i]= acc;
00143 }
00144
00145 return acc;
00146 }
00147
00148 static inline void add_median_prediction(uint8_t *dst, uint8_t *src1, uint8_t *diff, int w, int *left, int *left_top){
00149 int i;
00150 uint8_t l, lt;
00151
00152 l= *left;
00153 lt= *left_top;
00154
00155 for(i=0; i<w; i++){
00156 l= mid_pred(l, src1[i], (l + src1[i] - lt)&0xFF) + diff[i];
00157 lt= src1[i];
00158 dst[i]= l;
00159 }
00160
00161 *left= l;
00162 *left_top= lt;
00163 }
00164
00165 static inline void add_left_prediction_bgr32(uint8_t *dst, uint8_t *src, int w, int *red, int *green, int *blue){
00166 int i;
00167 int r,g,b;
00168 r= *red;
00169 g= *green;
00170 b= *blue;
00171
00172 for(i=0; i<w; i++){
00173 b+= src[4*i+B];
00174 g+= src[4*i+G];
00175 r+= src[4*i+R];
00176
00177 dst[4*i+B]= b;
00178 dst[4*i+G]= g;
00179 dst[4*i+R]= r;
00180 }
00181
00182 *red= r;
00183 *green= g;
00184 *blue= b;
00185 }
00186
00187 static inline int sub_left_prediction(HYuvContext *s, uint8_t *dst, uint8_t *src, int w, int left){
00188 int i;
00189 if(w<32){
00190 for(i=0; i<w; i++){
00191 const int temp= src[i];
00192 dst[i]= temp - left;
00193 left= temp;
00194 }
00195 return left;
00196 }else{
00197 for(i=0; i<16; i++){
00198 const int temp= src[i];
00199 dst[i]= temp - left;
00200 left= temp;
00201 }
00202 s->dsp.diff_bytes(dst+16, src+16, src+15, w-16);
00203 return src[w-1];
00204 }
00205 }
00206
00207 static void read_len_table(uint8_t *dst, GetBitContext *gb){
00208 int i, val, repeat;
00209
00210 for(i=0; i<256;){
00211 repeat= get_bits(gb, 3);
00212 val = get_bits(gb, 5);
00213 if(repeat==0)
00214 repeat= get_bits(gb, 8);
00215
00216 while (repeat--)
00217 dst[i++] = val;
00218 }
00219 }
00220
00221 static int generate_bits_table(uint32_t *dst, uint8_t *len_table){
00222 int len, index;
00223 uint32_t bits=0;
00224
00225 for(len=32; len>0; len--){
00226 for(index=0; index<256; index++){
00227 if(len_table[index]==len)
00228 dst[index]= bits++;
00229 }
00230 if(bits & 1){
00231 av_log(NULL, AV_LOG_ERROR, "Error generating huffman table\n");
00232 return -1;
00233 }
00234 bits >>= 1;
00235 }
00236 return 0;
00237 }
00238
00239 static void generate_len_table(uint8_t *dst, uint64_t *stats, int size){
00240 uint64_t counts[2*size];
00241 int up[2*size];
00242 int offset, i, next;
00243
00244 for(offset=1; ; offset<<=1){
00245 for(i=0; i<size; i++){
00246 counts[i]= stats[i] + offset - 1;
00247 }
00248
00249 for(next=size; next<size*2; next++){
00250 uint64_t min1, min2;
00251 int min1_i, min2_i;
00252
00253 min1=min2= INT64_MAX;
00254 min1_i= min2_i=-1;
00255
00256 for(i=0; i<next; i++){
00257 if(min2 > counts[i]){
00258 if(min1 > counts[i]){
00259 min2= min1;
00260 min2_i= min1_i;
00261 min1= counts[i];
00262 min1_i= i;
00263 }else{
00264 min2= counts[i];
00265 min2_i= i;
00266 }
00267 }
00268 }
00269
00270 if(min2==INT64_MAX) break;
00271
00272 counts[next]= min1 + min2;
00273 counts[min1_i]=
00274 counts[min2_i]= INT64_MAX;
00275 up[min1_i]=
00276 up[min2_i]= next;
00277 up[next]= -1;
00278 }
00279
00280 for(i=0; i<size; i++){
00281 int len;
00282 int index=i;
00283
00284 for(len=0; up[index] != -1; len++)
00285 index= up[index];
00286
00287 if(len >= 32) break;
00288
00289 dst[i]= len;
00290 }
00291 if(i==size) break;
00292 }
00293 }
00294
00295 static int read_huffman_tables(HYuvContext *s, uint8_t *src, int length){
00296 GetBitContext gb;
00297 int i;
00298
00299 init_get_bits(&gb, src, length*8);
00300
00301 for(i=0; i<3; i++){
00302 read_len_table(s->len[i], &gb);
00303
00304 if(generate_bits_table(s->bits[i], s->len[i])<0){
00305 return -1;
00306 }
00307 #if 0
00308 for(j=0; j<256; j++){
00309 printf("%6X, %2d, %3d\n", s->bits[i][j], s->len[i][j], j);
00310 }
00311 #endif
00312 free_vlc(&s->vlc[i]);
00313 init_vlc(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1, s->bits[i], 4, 4, 0);
00314 }
00315
00316 return (get_bits_count(&gb)+7)/8;
00317 }
00318
00319 static int read_old_huffman_tables(HYuvContext *s){
00320 #if 1
00321 GetBitContext gb;
00322 int i;
00323
00324 init_get_bits(&gb, classic_shift_luma, sizeof(classic_shift_luma)*8);
00325 read_len_table(s->len[0], &gb);
00326 init_get_bits(&gb, classic_shift_chroma, sizeof(classic_shift_chroma)*8);
00327 read_len_table(s->len[1], &gb);
00328
00329 for(i=0; i<256; i++) s->bits[0][i] = classic_add_luma [i];
00330 for(i=0; i<256; i++) s->bits[1][i] = classic_add_chroma[i];
00331
00332 if(s->bitstream_bpp >= 24){
00333 memcpy(s->bits[1], s->bits[0], 256*sizeof(uint32_t));
00334 memcpy(s->len[1] , s->len [0], 256*sizeof(uint8_t));
00335 }
00336 memcpy(s->bits[2], s->bits[1], 256*sizeof(uint32_t));
00337 memcpy(s->len[2] , s->len [1], 256*sizeof(uint8_t));
00338
00339 for(i=0; i<3; i++){
00340 free_vlc(&s->vlc[i]);
00341 init_vlc(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1, s->bits[i], 4, 4, 0);
00342 }
00343
00344 return 0;
00345 #else
00346 fprintf(stderr, "v1 huffyuv is not supported \n");
00347 return -1;
00348 #endif
00349 }
00350
00351 static void alloc_temp(HYuvContext *s){
00352 int i;
00353
00354 if(s->bitstream_bpp<24){
00355 for(i=0; i<3; i++){
00356 s->temp[i]= av_malloc(s->width + 16);
00357 }
00358 }else{
00359 s->temp[0]= av_malloc(4*s->width + 16);
00360 }
00361 }
00362
00363 static int common_init(AVCodecContext *avctx){
00364 HYuvContext *s = avctx->priv_data;
00365
00366 s->avctx= avctx;
00367 s->flags= avctx->flags;
00368
00369 dsputil_init(&s->dsp, avctx);
00370
00371 s->width= avctx->width;
00372 s->height= avctx->height;
00373 assert(s->width>0 && s->height>0);
00374
00375 return 0;
00376 }
00377
00378 static int decode_init(AVCodecContext *avctx)
00379 {
00380 HYuvContext *s = avctx->priv_data;
00381
00382 common_init(avctx);
00383 memset(s->vlc, 0, 3*sizeof(VLC));
00384
00385 avctx->coded_frame= &s->picture;
00386 s->interlaced= s->height > 288;
00387
00388 s->bgr32=1;
00389
00390
00391 if(avctx->extradata_size){
00392 if((avctx->bits_per_sample&7) && avctx->bits_per_sample != 12)
00393 s->version=1;
00394 else
00395 s->version=2;
00396 }else
00397 s->version=0;
00398
00399 if(s->version==2){
00400 int method, interlace;
00401
00402 method= ((uint8_t*)avctx->extradata)[0];
00403 s->decorrelate= method&64 ? 1 : 0;
00404 s->predictor= method&63;
00405 s->bitstream_bpp= ((uint8_t*)avctx->extradata)[1];
00406 if(s->bitstream_bpp==0)
00407 s->bitstream_bpp= avctx->bits_per_sample&~7;
00408 interlace= (((uint8_t*)avctx->extradata)[2] & 0x30) >> 4;
00409 s->interlaced= (interlace==1) ? 1 : (interlace==2) ? 0 : s->interlaced;
00410 s->context= ((uint8_t*)avctx->extradata)[2] & 0x40 ? 1 : 0;
00411
00412 if(read_huffman_tables(s, ((uint8_t*)avctx->extradata)+4, avctx->extradata_size) < 0)
00413 return -1;
00414 }else{
00415 switch(avctx->bits_per_sample&7){
00416 case 1:
00417 s->predictor= LEFT;
00418 s->decorrelate= 0;
00419 break;
00420 case 2:
00421 s->predictor= LEFT;
00422 s->decorrelate= 1;
00423 break;
00424 case 3:
00425 s->predictor= PLANE;
00426 s->decorrelate= avctx->bits_per_sample >= 24;
00427 break;
00428 case 4:
00429 s->predictor= MEDIAN;
00430 s->decorrelate= 0;
00431 break;
00432 default:
00433 s->predictor= LEFT;
00434 s->decorrelate= 0;
00435 break;
00436 }
00437 s->bitstream_bpp= avctx->bits_per_sample & ~7;
00438 s->context= 0;
00439
00440 if(read_old_huffman_tables(s) < 0)
00441 return -1;
00442 }
00443
00444 switch(s->bitstream_bpp){
00445 case 12:
00446 avctx->pix_fmt = PIX_FMT_YUV420P;
00447 break;
00448 case 16:
00449 if(s->yuy2){
00450 avctx->pix_fmt = PIX_FMT_YUV422;
00451 }else{
00452 avctx->pix_fmt = PIX_FMT_YUV422P;
00453 }
00454 break;
00455 case 24:
00456 case 32:
00457 if(s->bgr32){
00458 avctx->pix_fmt = PIX_FMT_RGBA32;
00459 }else{
00460 avctx->pix_fmt = PIX_FMT_BGR24;
00461 }
00462 break;
00463 default:
00464 assert(0);
00465 }
00466
00467 alloc_temp(s);
00468
00469
00470
00471 return 0;
00472 }
00473
00474 static int store_table(HYuvContext *s, uint8_t *len, uint8_t *buf){
00475 int i;
00476 int index= 0;
00477
00478 for(i=0; i<256;){
00479 int val= len[i];
00480 int repeat=0;
00481
00482 for(; i<256 && len[i]==val && repeat<255; i++)
00483 repeat++;
00484
00485 assert(val < 32 && val >0 && repeat<256 && repeat>0);
00486 if(repeat>7){
00487 buf[index++]= val;
00488 buf[index++]= repeat;
00489 }else{
00490 buf[index++]= val | (repeat<<5);
00491 }
00492 }
00493
00494 return index;
00495 }
00496
00497 static int encode_init(AVCodecContext *avctx)
00498 {
00499 HYuvContext *s = avctx->priv_data;
00500 int i, j;
00501
00502 common_init(avctx);
00503
00504 avctx->extradata= av_mallocz(1024*30);
00505 avctx->stats_out= av_mallocz(1024*30);
00506 s->version=2;
00507
00508 avctx->coded_frame= &s->picture;
00509
00510 switch(avctx->pix_fmt){
00511 case PIX_FMT_YUV420P:
00512 s->bitstream_bpp= 12;
00513 break;
00514 case PIX_FMT_YUV422P:
00515 s->bitstream_bpp= 16;
00516 break;
00517 default:
00518 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
00519 return -1;
00520 }
00521 avctx->bits_per_sample= s->bitstream_bpp;
00522 s->decorrelate= s->bitstream_bpp >= 24;
00523 s->predictor= avctx->prediction_method;
00524 s->interlaced= avctx->flags&CODEC_FLAG_INTERLACED_ME ? 1 : 0;
00525 if(avctx->context_model==1){
00526 s->context= avctx->context_model;
00527 if(s->flags & (CODEC_FLAG_PASS1|CODEC_FLAG_PASS2)){
00528 av_log(avctx, AV_LOG_ERROR, "context=1 is not compatible with 2 pass huffyuv encoding\n");
00529 return -1;
00530 }
00531 }else s->context= 0;
00532
00533 if(avctx->codec->id==CODEC_ID_HUFFYUV){
00534 if(avctx->pix_fmt==PIX_FMT_YUV420P){
00535 av_log(avctx, AV_LOG_ERROR, "Error: YV12 is not supported by huffyuv; use vcodec=ffvhuff or format=422p\n");
00536 return -1;
00537 }
00538 if(avctx->context_model){
00539 av_log(avctx, AV_LOG_ERROR, "Error: per-frame huffman tables are not supported by huffyuv; use vcodec=ffvhuff\n");
00540 return -1;
00541 }
00542 if(s->interlaced != ( s->height > 288 ))
00543 av_log(avctx, AV_LOG_INFO, "using huffyuv 2.2.0 or newer interlacing flag\n");
00544 }else if(avctx->strict_std_compliance>FF_COMPLIANCE_EXPERIMENTAL){
00545 av_log(avctx, AV_LOG_ERROR, "This codec is under development; files encoded with it may not be decodable with future versions!!! Set vstrict=-2 / -strict -2 to use it anyway.\n");
00546 return -1;
00547 }
00548
00549 ((uint8_t*)avctx->extradata)[0]= s->predictor;
00550 ((uint8_t*)avctx->extradata)[1]= s->bitstream_bpp;
00551 ((uint8_t*)avctx->extradata)[2]= s->interlaced ? 0x10 : 0x20;
00552 if(s->context)
00553 ((uint8_t*)avctx->extradata)[2]|= 0x40;
00554 ((uint8_t*)avctx->extradata)[3]= 0;
00555 s->avctx->extradata_size= 4;
00556
00557 if(avctx->stats_in){
00558 char *p= avctx->stats_in;
00559
00560 for(i=0; i<3; i++)
00561 for(j=0; j<256; j++)
00562 s->stats[i][j]= 1;
00563
00564 for(;;){
00565 for(i=0; i<3; i++){
00566 char *next;
00567
00568 for(j=0; j<256; j++){
00569 s->stats[i][j]+= strtol(p, &next, 0);
00570 if(next==p) return -1;
00571 p=next;
00572 }
00573 }
00574 if(p[0]==0 || p[1]==0 || p[2]==0) break;
00575 }
00576 }else{
00577 for(i=0; i<3; i++)
00578 for(j=0; j<256; j++){
00579 int d= FFMIN(j, 256-j);
00580
00581 s->stats[i][j]= 100000000/(d+1);
00582 }
00583 }
00584
00585 for(i=0; i<3; i++){
00586 generate_len_table(s->len[i], s->stats[i], 256);
00587
00588 if(generate_bits_table(s->bits[i], s->len[i])<0){
00589 return -1;
00590 }
00591
00592 s->avctx->extradata_size+=
00593 store_table(s, s->len[i], &((uint8_t*)s->avctx->extradata)[s->avctx->extradata_size]);
00594 }
00595
00596 if(s->context){
00597 for(i=0; i<3; i++){
00598 int pels = s->width*s->height / (i?40:10);
00599 for(j=0; j<256; j++){
00600 int d= FFMIN(j, 256-j);
00601 s->stats[i][j]= pels/(d+1);
00602 }
00603 }
00604 }else{
00605 for(i=0; i<3; i++)
00606 for(j=0; j<256; j++)
00607 s->stats[i][j]= 0;
00608 }
00609
00610
00611
00612 alloc_temp(s);
00613
00614 s->picture_number=0;
00615
00616 return 0;
00617 }
00618
00619 static void decode_422_bitstream(HYuvContext *s, int count){
00620 int i;
00621
00622 count/=2;
00623
00624 for(i=0; i<count; i++){
00625 s->temp[0][2*i ]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3);
00626 s->temp[1][ i ]= get_vlc2(&s->gb, s->vlc[1].table, VLC_BITS, 3);
00627 s->temp[0][2*i+1]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3);
00628 s->temp[2][ i ]= get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3);
00629 }
00630 }
00631
00632 static void decode_gray_bitstream(HYuvContext *s, int count){
00633 int i;
00634
00635 count/=2;
00636
00637 for(i=0; i<count; i++){
00638 s->temp[0][2*i ]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3);
00639 s->temp[0][2*i+1]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3);
00640 }
00641 }
00642
00643 static int encode_422_bitstream(HYuvContext *s, int count){
00644 int i;
00645
00646 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < 2*4*count){
00647 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
00648 return -1;
00649 }
00650
00651 count/=2;
00652 if(s->flags&CODEC_FLAG_PASS1){
00653 for(i=0; i<count; i++){
00654 s->stats[0][ s->temp[0][2*i ] ]++;
00655 s->stats[1][ s->temp[1][ i ] ]++;
00656 s->stats[0][ s->temp[0][2*i+1] ]++;
00657 s->stats[2][ s->temp[2][ i ] ]++;
00658 }
00659 }
00660 if(s->avctx->flags2&CODEC_FLAG2_NO_OUTPUT)
00661 return 0;
00662 if(s->context){
00663 for(i=0; i<count; i++){
00664 s->stats[0][ s->temp[0][2*i ] ]++;
00665 put_bits(&s->pb, s->len[0][ s->temp[0][2*i ] ], s->bits[0][ s->temp[0][2*i ] ]);
00666 s->stats[1][ s->temp[1][ i ] ]++;
00667 put_bits(&s->pb, s->len[1][ s->temp[1][ i ] ], s->bits[1][ s->temp[1][ i ] ]);
00668 s->stats[0][ s->temp[0][2*i+1] ]++;
00669 put_bits(&s->pb, s->len[0][ s->temp[0][2*i+1] ], s->bits[0][ s->temp[0][2*i+1] ]);
00670 s->stats[2][ s->temp[2][ i ] ]++;
00671 put_bits(&s->pb, s->len[2][ s->temp[2][ i ] ], s->bits[2][ s->temp[2][ i ] ]);
00672 }
00673 }else{
00674 for(i=0; i<count; i++){
00675 put_bits(&s->pb, s->len[0][ s->temp[0][2*i ] ], s->bits[0][ s->temp[0][2*i ] ]);
00676 put_bits(&s->pb, s->len[1][ s->temp[1][ i ] ], s->bits[1][ s->temp[1][ i ] ]);
00677 put_bits(&s->pb, s->len[0][ s->temp[0][2*i+1] ], s->bits[0][ s->temp[0][2*i+1] ]);
00678 put_bits(&s->pb, s->len[2][ s->temp[2][ i ] ], s->bits[2][ s->temp[2][ i ] ]);
00679 }
00680 }
00681 return 0;
00682 }
00683
00684 static int encode_gray_bitstream(HYuvContext *s, int count){
00685 int i;
00686
00687 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < 4*count){
00688 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
00689 return -1;
00690 }
00691
00692 count/=2;
00693 if(s->flags&CODEC_FLAG_PASS1){
00694 for(i=0; i<count; i++){
00695 s->stats[0][ s->temp[0][2*i ] ]++;
00696 s->stats[0][ s->temp[0][2*i+1] ]++;
00697 }
00698 }
00699 if(s->avctx->flags2&CODEC_FLAG2_NO_OUTPUT)
00700 return 0;
00701
00702 if(s->context){
00703 for(i=0; i<count; i++){
00704 s->stats[0][ s->temp[0][2*i ] ]++;
00705 put_bits(&s->pb, s->len[0][ s->temp[0][2*i ] ], s->bits[0][ s->temp[0][2*i ] ]);
00706 s->stats[0][ s->temp[0][2*i+1] ]++;
00707 put_bits(&s->pb, s->len[0][ s->temp[0][2*i+1] ], s->bits[0][ s->temp[0][2*i+1] ]);
00708 }
00709 }else{
00710 for(i=0; i<count; i++){
00711 put_bits(&s->pb, s->len[0][ s->temp[0][2*i ] ], s->bits[0][ s->temp[0][2*i ] ]);
00712 put_bits(&s->pb, s->len[0][ s->temp[0][2*i+1] ], s->bits[0][ s->temp[0][2*i+1] ]);
00713 }
00714 }
00715 return 0;
00716 }
00717
00718 static void decode_bgr_bitstream(HYuvContext *s, int count){
00719 int i;
00720
00721 if(s->decorrelate){
00722 if(s->bitstream_bpp==24){
00723 for(i=0; i<count; i++){
00724 s->temp[0][4*i+G]= get_vlc2(&s->gb, s->vlc[1].table, VLC_BITS, 3);
00725 s->temp[0][4*i+B]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3) + s->temp[0][4*i+G];
00726 s->temp[0][4*i+R]= get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3) + s->temp[0][4*i+G];
00727 }
00728 }else{
00729 for(i=0; i<count; i++){
00730 s->temp[0][4*i+G]= get_vlc2(&s->gb, s->vlc[1].table, VLC_BITS, 3);
00731 s->temp[0][4*i+B]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3) + s->temp[0][4*i+G];
00732 s->temp[0][4*i+R]= get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3) + s->temp[0][4*i+G];
00733 get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3);
00734 }
00735 }
00736 }else{
00737 if(s->bitstream_bpp==24){
00738 for(i=0; i<count; i++){
00739 s->temp[0][4*i+B]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3);
00740 s->temp[0][4*i+G]= get_vlc2(&s->gb, s->vlc[1].table, VLC_BITS, 3);
00741 s->temp[0][4*i+R]= get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3);
00742 }
00743 }else{
00744 for(i=0; i<count; i++){
00745 s->temp[0][4*i+B]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3);
00746 s->temp[0][4*i+G]= get_vlc2(&s->gb, s->vlc[1].table, VLC_BITS, 3);
00747 s->temp[0][4*i+R]= get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3);
00748 get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3);
00749 }
00750 }
00751 }
00752 }
00753
00754 static void draw_slice(HYuvContext *s, int y){
00755 int h, cy;
00756 int offset[4];
00757
00758 if(s->avctx->draw_horiz_band==NULL)
00759 return;
00760
00761 h= y - s->last_slice_end;
00762 y -= h;
00763
00764 if(s->bitstream_bpp==12){
00765 cy= y>>1;
00766 }else{
00767 cy= y;
00768 }
00769
00770 offset[0] = s->picture.linesize[0]*y;
00771 offset[1] = s->picture.linesize[1]*cy;
00772 offset[2] = s->picture.linesize[2]*cy;
00773 offset[3] = 0;
00774 emms_c();
00775
00776 s->avctx->draw_horiz_band(s->avctx, &s->picture, offset, y, 3, h);
00777
00778 s->last_slice_end= y + h;
00779 }
00780
00781 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size){
00782 HYuvContext *s = avctx->priv_data;
00783 const int width= s->width;
00784 const int width2= s->width>>1;
00785 const int height= s->height;
00786 int fake_ystride, fake_ustride, fake_vstride;
00787 AVFrame * const p= &s->picture;
00788 int table_size= 0;
00789
00790 AVFrame *picture = data;
00791
00792 s->bitstream_buffer= av_fast_realloc(s->bitstream_buffer, &s->bitstream_buffer_size, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
00793
00794 s->dsp.bswap_buf((uint32_t*)s->bitstream_buffer, (uint32_t*)buf, buf_size/4);
00795
00796 if(p->data[0])
00797 avctx->release_buffer(avctx, p);
00798
00799 p->reference= 0;
00800 if(avctx->get_buffer(avctx, p) < 0){
00801 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
00802 return -1;
00803 }
00804
00805 if(s->context){
00806 table_size = read_huffman_tables(s, s->bitstream_buffer, buf_size);
00807 if(table_size < 0)
00808 return -1;
00809 }
00810
00811 init_get_bits(&s->gb, s->bitstream_buffer+table_size, (buf_size-table_size)*8);
00812
00813 fake_ystride= s->interlaced ? p->linesize[0]*2 : p->linesize[0];
00814 fake_ustride= s->interlaced ? p->linesize[1]*2 : p->linesize[1];
00815 fake_vstride= s->interlaced ? p->linesize[2]*2 : p->linesize[2];
00816
00817 s->last_slice_end= 0;
00818
00819 if(s->bitstream_bpp<24){
00820 int y, cy;
00821 int lefty, leftu, leftv;
00822 int lefttopy, lefttopu, lefttopv;
00823
00824 if(s->yuy2){
00825 p->data[0][3]= get_bits(&s->gb, 8);
00826 p->data[0][2]= get_bits(&s->gb, 8);
00827 p->data[0][1]= get_bits(&s->gb, 8);
00828 p->data[0][0]= get_bits(&s->gb, 8);
00829
00830 av_log(avctx, AV_LOG_ERROR, "YUY2 output is not implemented yet\n");
00831 return -1;
00832 }else{
00833
00834 leftv= p->data[2][0]= get_bits(&s->gb, 8);
00835 lefty= p->data[0][1]= get_bits(&s->gb, 8);
00836 leftu= p->data[1][0]= get_bits(&s->gb, 8);
00837 p->data[0][0]= get_bits(&s->gb, 8);
00838
00839 switch(s->predictor){
00840 case LEFT:
00841 case PLANE:
00842 decode_422_bitstream(s, width-2);
00843 lefty= add_left_prediction(p->data[0] + 2, s->temp[0], width-2, lefty);
00844 if(!(s->flags&CODEC_FLAG_GRAY)){
00845 leftu= add_left_prediction(p->data[1] + 1, s->temp[1], width2-1, leftu);
00846 leftv= add_left_prediction(p->data[2] + 1, s->temp[2], width2-1, leftv);
00847 }
00848
00849 for(cy=y=1; y<s->height; y++,cy++){
00850 uint8_t *ydst, *udst, *vdst;
00851
00852 if(s->bitstream_bpp==12){
00853 decode_gray_bitstream(s, width);
00854
00855 ydst= p->data[0] + p->linesize[0]*y;
00856
00857 lefty= add_left_prediction(ydst, s->temp[0], width, lefty);
00858 if(s->predictor == PLANE){
00859 if(y>s->interlaced)
00860 s->dsp.add_bytes(ydst, ydst - fake_ystride, width);
00861 }
00862 y++;
00863 if(y>=s->height) break;
00864 }
00865
00866 draw_slice(s, y);
00867
00868 ydst= p->data[0] + p->linesize[0]*y;
00869 udst= p->data[1] + p->linesize[1]*cy;
00870 vdst= p->data[2] + p->linesize[2]*cy;
00871
00872 decode_422_bitstream(s, width);
00873 lefty= add_left_prediction(ydst, s->temp[0], width, lefty);
00874 if(!(s->flags&CODEC_FLAG_GRAY)){
00875 leftu= add_left_prediction(udst, s->temp[1], width2, leftu);
00876 leftv= add_left_prediction(vdst, s->temp[2], width2, leftv);
00877 }
00878 if(s->predictor == PLANE){
00879 if(cy>s->interlaced){
00880 s->dsp.add_bytes(ydst, ydst - fake_ystride, width);
00881 if(!(s->flags&CODEC_FLAG_GRAY)){
00882 s->dsp.add_bytes(udst, udst - fake_ustride, width2);
00883 s->dsp.add_bytes(vdst, vdst - fake_vstride, width2);
00884 }
00885 }
00886 }
00887 }
00888 draw_slice(s, height);
00889
00890 break;
00891 case MEDIAN:
00892
00893 decode_422_bitstream(s, width-2);
00894 lefty= add_left_prediction(p->data[0] + 2, s->temp[0], width-2, lefty);
00895 if(!(s->flags&CODEC_FLAG_GRAY)){
00896 leftu= add_left_prediction(p->data[1] + 1, s->temp[1], width2-1, leftu);
00897 leftv= add_left_prediction(p->data[2] + 1, s->temp[2], width2-1, leftv);
00898 }
00899
00900 cy=y=1;
00901
00902
00903 if(s->interlaced){
00904 decode_422_bitstream(s, width);
00905 lefty= add_left_prediction(p->data[0] + p->linesize[0], s->temp[0], width, lefty);
00906 if(!(s->flags&CODEC_FLAG_GRAY)){
00907 leftu= add_left_prediction(p->data[1] + p->linesize[2], s->temp[1], width2, leftu);
00908 leftv= add_left_prediction(p->data[2] + p->linesize[1], s->temp[2], width2, leftv);
00909 }
00910 y++; cy++;
00911 }
00912
00913
00914 decode_422_bitstream(s, 4);
00915 lefty= add_left_prediction(p->data[0] + fake_ystride, s->temp[0], 4, lefty);
00916 if(!(s->flags&CODEC_FLAG_GRAY)){
00917 leftu= add_left_prediction(p->data[1] + fake_ustride, s->temp[1], 2, leftu);
00918 leftv= add_left_prediction(p->data[2] + fake_vstride, s->temp[2], 2, leftv);
00919 }
00920
00921
00922 lefttopy= p->data[0][3];
00923 decode_422_bitstream(s, width-4);
00924 add_median_prediction(p->data[0] + fake_ystride+4, p->data[0]+4, s->temp[0], width-4, &lefty, &lefttopy);
00925 if(!(s->flags&CODEC_FLAG_GRAY)){
00926 lefttopu= p->data[1][1];
00927 lefttopv= p->data[2][1];
00928 add_median_prediction(p->data[1] + fake_ustride+2, p->data[1]+2, s->temp[1], width2-2, &leftu, &lefttopu);
00929 add_median_prediction(p->data[2] + fake_vstride+2, p->data[2]+2, s->temp[2], width2-2, &leftv, &lefttopv);
00930 }
00931 y++; cy++;
00932
00933 for(; y<height; y++,cy++){
00934 uint8_t *ydst, *udst, *vdst;
00935
00936 if(s->bitstream_bpp==12){
00937 while(2*cy > y){
00938 decode_gray_bitstream(s, width);
00939 ydst= p->data[0] + p->linesize[0]*y;
00940 add_median_prediction(ydst, ydst - fake_ystride, s->temp[0], width, &lefty, &lefttopy);
00941 y++;
00942 }
00943 if(y>=height) break;
00944 }
00945 draw_slice(s, y);
00946
00947 decode_422_bitstream(s, width);
00948
00949 ydst= p->data[0] + p->linesize[0]*y;
00950 udst= p->data[1] + p->linesize[1]*cy;
00951 vdst= p->data[2] + p->linesize[2]*cy;
00952
00953 add_median_prediction(ydst, ydst - fake_ystride, s->temp[0], width, &lefty, &lefttopy);
00954 if(!(s->flags&CODEC_FLAG_GRAY)){
00955 add_median_prediction(udst, udst - fake_ustride, s->temp[1], width2, &leftu, &lefttopu);
00956 add_median_prediction(vdst, vdst - fake_vstride, s->temp[2], width2, &leftv, &lefttopv);
00957 }
00958 }
00959
00960 draw_slice(s, height);
00961 break;
00962 }
00963 }
00964 }else{
00965 int y;
00966 int leftr, leftg, leftb;
00967 const int last_line= (height-1)*p->linesize[0];
00968
00969 if(s->bitstream_bpp==32){
00970 skip_bits(&s->gb, 8);
00971 leftr= p->data[0][last_line+R]= get_bits(&s->gb, 8);
00972 leftg= p->data[0][last_line+G]= get_bits(&s->gb, 8);
00973 leftb= p->data[0][last_line+B]= get_bits(&s->gb, 8);
00974 }else{
00975 leftr= p->data[0][last_line+R]= get_bits(&s->gb, 8);
00976 leftg= p->data[0][last_line+G]= get_bits(&s->gb, 8);
00977 leftb= p->data[0][last_line+B]= get_bits(&s->gb, 8);
00978 skip_bits(&s->gb, 8);
00979 }
00980
00981 if(s->bgr32){
00982 switch(s->predictor){
00983 case LEFT:
00984 case PLANE:
00985 decode_bgr_bitstream(s, width-1);
00986 add_left_prediction_bgr32(p->data[0] + last_line+4, s->temp[0], width-1, &leftr, &leftg, &leftb);
00987
00988 for(y=s->height-2; y>=0; y--){
00989 decode_bgr_bitstream(s, width);
00990
00991 add_left_prediction_bgr32(p->data[0] + p->linesize[0]*y, s->temp[0], width, &leftr, &leftg, &leftb);
00992 if(s->predictor == PLANE){
00993 if((y&s->interlaced)==0 && y<s->height-1-s->interlaced){
00994 s->dsp.add_bytes(p->data[0] + p->linesize[0]*y,
00995 p->data[0] + p->linesize[0]*y + fake_ystride, fake_ystride);
00996 }
00997 }
00998 }
00999 draw_slice(s, height);
01000 break;
01001 default:
01002 av_log(avctx, AV_LOG_ERROR, "prediction type not supported!\n");
01003 }
01004 }else{
01005
01006 av_log(avctx, AV_LOG_ERROR, "BGR24 output is not implemented yet\n");
01007 return -1;
01008 }
01009 }
01010 emms_c();
01011
01012 *picture= *p;
01013 *data_size = sizeof(AVFrame);
01014
01015 return (get_bits_count(&s->gb)+31)/32*4;
01016 }
01017
01018 static int common_end(HYuvContext *s){
01019 int i;
01020
01021 for(i=0; i<3; i++){
01022 av_freep(&s->temp[i]);
01023 }
01024 return 0;
01025 }
01026
01027 static int decode_end(AVCodecContext *avctx)
01028 {
01029 HYuvContext *s = avctx->priv_data;
01030 int i;
01031
01032 common_end(s);
01033 av_freep(&s->bitstream_buffer);
01034
01035 for(i=0; i<3; i++){
01036 free_vlc(&s->vlc[i]);
01037 }
01038
01039 return 0;
01040 }
01041
01042 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
01043 HYuvContext *s = avctx->priv_data;
01044 AVFrame *pict = data;
01045 const int width= s->width;
01046 const int width2= s->width>>1;
01047 const int height= s->height;
01048 const int fake_ystride= s->interlaced ? pict->linesize[0]*2 : pict->linesize[0];
01049 const int fake_ustride= s->interlaced ? pict->linesize[1]*2 : pict->linesize[1];
01050 const int fake_vstride= s->interlaced ? pict->linesize[2]*2 : pict->linesize[2];
01051 AVFrame * const p= &s->picture;
01052 int i, j, size=0;
01053
01054 *p = *pict;
01055 p->pict_type= FF_I_TYPE;
01056 p->key_frame= 1;
01057
01058 if(s->context){
01059 for(i=0; i<3; i++){
01060 generate_len_table(s->len[i], s->stats[i], 256);
01061 if(generate_bits_table(s->bits[i], s->len[i])<0)
01062 return -1;
01063 size+= store_table(s, s->len[i], &buf[size]);
01064 }
01065
01066 for(i=0; i<3; i++)
01067 for(j=0; j<256; j++)
01068 s->stats[i][j] >>= 1;
01069 }
01070
01071 init_put_bits(&s->pb, buf+size, buf_size-size);
01072
01073 if(avctx->pix_fmt == PIX_FMT_YUV422P || avctx->pix_fmt == PIX_FMT_YUV420P){
01074 int lefty, leftu, leftv, y, cy;
01075
01076 put_bits(&s->pb, 8, leftv= p->data[2][0]);
01077 put_bits(&s->pb, 8, lefty= p->data[0][1]);
01078 put_bits(&s->pb, 8, leftu= p->data[1][0]);
01079 put_bits(&s->pb, 8, p->data[0][0]);
01080
01081 lefty= sub_left_prediction(s, s->temp[0], p->data[0]+2, width-2 , lefty);
01082 leftu= sub_left_prediction(s, s->temp[1], p->data[1]+1, width2-1, leftu);
01083 leftv= sub_left_prediction(s, s->temp[2], p->data[2]+1, width2-1, leftv);
01084
01085 encode_422_bitstream(s, width-2);
01086
01087 if(s->predictor==MEDIAN){
01088 int lefttopy, lefttopu, lefttopv;
01089 cy=y=1;
01090 if(s->interlaced){
01091 lefty= sub_left_prediction(s, s->temp[0], p->data[0]+p->linesize[0], width , lefty);
01092 leftu= sub_left_prediction(s, s->temp[1], p->data[1]+p->linesize[1], width2, leftu);
01093 leftv= sub_left_prediction(s, s->temp[2], p->data[2]+p->linesize[2], width2, leftv);
01094
01095 encode_422_bitstream(s, width);
01096 y++; cy++;
01097 }
01098
01099 lefty= sub_left_prediction(s, s->temp[0], p->data[0]+fake_ystride, 4, lefty);
01100 leftu= sub_left_prediction(s, s->temp[1], p->data[1]+fake_ustride, 2, leftu);
01101 leftv= sub_left_prediction(s, s->temp[2], p->data[2]+fake_vstride, 2, leftv);
01102
01103 encode_422_bitstream(s, 4);
01104
01105 lefttopy= p->data[0][3];
01106 lefttopu= p->data[1][1];
01107 lefttopv= p->data[2][1];
01108 s->dsp.sub_hfyu_median_prediction(s->temp[0], p->data[0]+4, p->data[0] + fake_ystride+4, width-4 , &lefty, &lefttopy);
01109 s->dsp.sub_hfyu_median_prediction(s->temp[1], p->data[1]+2, p->data[1] + fake_ustride+2, width2-2, &leftu, &lefttopu);
01110 s->dsp.sub_hfyu_median_prediction(s->temp[2], p->data[2]+2, p->data[2] + fake_vstride+2, width2-2, &leftv, &lefttopv);
01111 encode_422_bitstream(s, width-4);
01112 y++; cy++;
01113
01114 for(; y<height; y++,cy++){
01115 uint8_t *ydst, *udst, *vdst;
01116
01117 if(s->bitstream_bpp==12){
01118 while(2*cy > y){
01119 ydst= p->data[0] + p->linesize[0]*y;
01120 s->dsp.sub_hfyu_median_prediction(s->temp[0], ydst - fake_ystride, ydst, width , &lefty, &lefttopy);
01121 encode_gray_bitstream(s, width);
01122 y++;
01123 }
01124 if(y>=height) break;
01125 }
01126 ydst= p->data[0] + p->linesize[0]*y;
01127 udst= p->data[1] + p->linesize[1]*cy;
01128 vdst= p->data[2] + p->linesize[2]*cy;
01129
01130 s->dsp.sub_hfyu_median_prediction(s->temp[0], ydst - fake_ystride, ydst, width , &lefty, &lefttopy);
01131 s->dsp.sub_hfyu_median_prediction(s->temp[1], udst - fake_ustride, udst, width2, &leftu, &lefttopu);
01132 s->dsp.sub_hfyu_median_prediction(s->temp[2], vdst - fake_vstride, vdst, width2, &leftv, &lefttopv);
01133
01134 encode_422_bitstream(s, width);
01135 }
01136 }else{
01137 for(cy=y=1; y<height; y++,cy++){
01138 uint8_t *ydst, *udst, *vdst;
01139
01140
01141 if(s->bitstream_bpp==12){
01142 ydst= p->data[0] + p->linesize[0]*y;
01143
01144 if(s->predictor == PLANE && s->interlaced < y){
01145 s->dsp.diff_bytes(s->temp[1], ydst, ydst - fake_ystride, width);
01146
01147 lefty= sub_left_prediction(s, s->temp[0], s->temp[1], width , lefty);
01148 }else{
01149 lefty= sub_left_prediction(s, s->temp[0], ydst, width , lefty);
01150 }
01151 encode_gray_bitstream(s, width);
01152 y++;
01153 if(y>=height) break;
01154 }
01155
01156 ydst= p->data[0] + p->linesize[0]*y;
01157 udst= p->data[1] + p->linesize[1]*cy;
01158 vdst= p->data[2] + p->linesize[2]*cy;
01159
01160 if(s->predictor == PLANE && s->interlaced < cy){
01161 s->dsp.diff_bytes(s->temp[1], ydst, ydst - fake_ystride, width);
01162 s->dsp.diff_bytes(s->temp[2], udst, udst - fake_ustride, width2);
01163 s->dsp.diff_bytes(s->temp[2] + width2, vdst, vdst - fake_vstride, width2);
01164
01165 lefty= sub_left_prediction(s, s->temp[0], s->temp[1], width , lefty);
01166 leftu= sub_left_prediction(s, s->temp[1], s->temp[2], width2, leftu);
01167 leftv= sub_left_prediction(s, s->temp[2], s->temp[2] + width2, width2, leftv);
01168 }else{
01169 lefty= sub_left_prediction(s, s->temp[0], ydst, width , lefty);
01170 leftu= sub_left_prediction(s, s->temp[1], udst, width2, leftu);
01171 leftv= sub_left_prediction(s, s->temp[2], vdst, width2, leftv);
01172 }
01173
01174 encode_422_bitstream(s, width);
01175 }
01176 }
01177 }else{
01178 av_log(avctx, AV_LOG_ERROR, "Format not supported!\n");
01179 }
01180 emms_c();
01181
01182 size+= (put_bits_count(&s->pb)+31)/8;
01183 size/= 4;
01184
01185 if((s->flags&CODEC_FLAG_PASS1) && (s->picture_number&31)==0){
01186 int j;
01187 char *p= avctx->stats_out;
01188 char *end= p + 1024*30;
01189 for(i=0; i<3; i++){
01190 for(j=0; j<256; j++){
01191 snprintf(p, end-p, "%llu ", s->stats[i][j]);
01192 p+= strlen(p);
01193 s->stats[i][j]= 0;
01194 }
01195 snprintf(p, end-p, "\n");
01196 p++;
01197 }
01198 }
01199 if(!(s->avctx->flags2 & CODEC_FLAG2_NO_OUTPUT)){
01200 flush_put_bits(&s->pb);
01201 s->dsp.bswap_buf((uint32_t*)buf, (uint32_t*)buf, size);
01202 avctx->stats_out[0] = '\0';
01203 }
01204
01205 s->picture_number++;
01206
01207 return size*4;
01208 }
01209
01210 static int encode_end(AVCodecContext *avctx)
01211 {
01212 HYuvContext *s = avctx->priv_data;
01213
01214 common_end(s);
01215
01216 av_freep(&avctx->extradata);
01217 av_freep(&avctx->stats_out);
01218
01219 return 0;
01220 }
01221
01222 AVCodec huffyuv_decoder = {
01223 "huffyuv",
01224 CODEC_TYPE_VIDEO,
01225 CODEC_ID_HUFFYUV,
01226 sizeof(HYuvContext),
01227 decode_init,
01228 NULL,
01229 decode_end,
01230 decode_frame,
01231 CODEC_CAP_DR1 | CODEC_CAP_DRAW_HORIZ_BAND,
01232 NULL
01233 };
01234
01235 AVCodec ffvhuff_decoder = {
01236 "ffvhuff",
01237 CODEC_TYPE_VIDEO,
01238 CODEC_ID_FFVHUFF,
01239 sizeof(HYuvContext),
01240 decode_init,
01241 NULL,
01242 decode_end,
01243 decode_frame,
01244 CODEC_CAP_DR1 | CODEC_CAP_DRAW_HORIZ_BAND,
01245 NULL
01246 };
01247
01248 #ifdef CONFIG_ENCODERS
01249
01250 AVCodec huffyuv_encoder = {
01251 "huffyuv",
01252 CODEC_TYPE_VIDEO,
01253 CODEC_ID_HUFFYUV,
01254 sizeof(HYuvContext),
01255 encode_init,
01256 encode_frame,
01257 encode_end,
01258 };
01259
01260 AVCodec ffvhuff_encoder = {
01261 "ffvhuff",
01262 CODEC_TYPE_VIDEO,
01263 CODEC_ID_FFVHUFF,
01264 sizeof(HYuvContext),
01265 encode_init,
01266 encode_frame,
01267 encode_end,
01268 };
01269
01270 #endif //CONFIG_ENCODERS