int flags;
int picture_number;
int last_slice_end;
- uint8_t __align8 temp[3][2500];
+ uint8_t __align8 temp[3][2560];
uint64_t stats[3][256];
uint8_t len[3][256];
uint32_t bits[3][256];
6, 12, 8, 10, 7, 9, 6, 4, 6, 2, 2, 3, 3, 3, 3, 2,
};
-static inline void bswap_buf(uint32_t *dst, uint32_t *src, int w){
- int i;
-
- for(i=0; i+8<=w; i+=8){
- dst[i+0]= bswap_32(src[i+0]);
- dst[i+1]= bswap_32(src[i+1]);
- dst[i+2]= bswap_32(src[i+2]);
- dst[i+3]= bswap_32(src[i+3]);
- dst[i+4]= bswap_32(src[i+4]);
- dst[i+5]= bswap_32(src[i+5]);
- dst[i+6]= bswap_32(src[i+6]);
- dst[i+7]= bswap_32(src[i+7]);
- }
- for(;i<w; i++){
- dst[i+0]= bswap_32(src[i+0]);
- }
-}
-
static inline int add_left_prediction(uint8_t *dst, uint8_t *src, int w, int acc){
int i;
*left= l;
*left_top= lt;
}
-//FIXME optimize
-static inline void sub_median_prediction(uint8_t *dst, uint8_t *src1, uint8_t *src2, int w, int *left, int *left_top){
- int i;
- uint8_t l, lt;
-
- l= *left;
- lt= *left_top;
-
- for(i=0; i<w; i++){
- const int pred= mid_pred(l, src1[i], (l + src1[i] - lt)&0xFF);
- lt= src1[i];
- l= src2[i];
- dst[i]= l - pred;
- }
-
- *left= l;
- *left_top= lt;
-}
-
static inline void add_left_prediction_bgr32(uint8_t *dst, uint8_t *src, int w, int *red, int *green, int *blue){
int i;
uint32_t bits=0;
for(len=32; len>0; len--){
- int bit= 1<<(32-len);
for(index=0; index<256; index++){
- if(len_table[index]==len){
- if(bits & (bit-1)){
- fprintf(stderr, "Error generating huffman table\n");
- return -1;
- }
- dst[index]= bits>>(32-len);
- bits+= bit;
- }
+ if(len_table[index]==len)
+ dst[index]= bits++;
+ }
+ if(bits & 1){
+ av_log(NULL, AV_LOG_ERROR, "Error generating huffman table\n");
+ return -1;
}
+ bits >>= 1;
}
return 0;
}
int index= s->avctx->extradata_size;
for(i=0; i<256;){
- int cur=i;
int val= len[i];
- int repeat;
-
- for(; i<256 && len[i]==val; i++);
+ int repeat=0;
- repeat= i - cur;
+ for(; i<256 && len[i]==val && repeat<255; i++)
+ repeat++;
+ assert(val < 32 && val >0 && repeat<256 && repeat>0);
if(repeat>7){
((uint8_t*)s->avctx->extradata)[index++]= val;
((uint8_t*)s->avctx->extradata)[index++]= repeat;
assert(width && height);
- avctx->extradata= av_mallocz(1024*10);
- avctx->stats_out= av_mallocz(1024*10);
+ avctx->extradata= av_mallocz(1024*30);
+ avctx->stats_out= av_mallocz(1024*30);
s->version=2;
avctx->coded_frame= &s->picture;
switch(avctx->pix_fmt){
case PIX_FMT_YUV420P:
if(avctx->strict_std_compliance>=0){
- fprintf(stderr, "YV12-huffyuv is experimental, there WILL be no compatbility! (use (v)strict=-1)\n");
+ av_log(avctx, AV_LOG_ERROR, "YV12-huffyuv is experimental, there WILL be no compatbility! (use (v)strict=-1)\n");
return -1;
}
s->bitstream_bpp= 12;
s->bitstream_bpp= 16;
break;
default:
- fprintf(stderr, "format not supported\n");
+ av_log(avctx, AV_LOG_ERROR, "format not supported\n");
return -1;
}
avctx->bits_per_sample= s->bitstream_bpp;
s->stats[i][j]= 0;
s->interlaced= height > 288;
-
+
// printf("pred:%d bpp:%d hbpp:%d il:%d\n", s->predictor, s->bitstream_bpp, avctx->bits_per_sample, s->interlaced);
-
+
s->picture_number=0;
-
+
return 0;
}
static void decode_422_bitstream(HYuvContext *s, int count){
int i;
-
+
count/=2;
for(i=0; i<count; i++){
static void decode_bgr_bitstream(HYuvContext *s, int count){
int i;
-
+
if(s->decorrelate){
if(s->bitstream_bpp==24){
for(i=0; i<count; i++){
static void draw_slice(HYuvContext *s, int y){
int h, cy;
- uint8_t *src_ptr[3];
+ int offset[4];
if(s->avctx->draw_horiz_band==NULL)
return;
}else{
cy= y;
}
-
- src_ptr[0] = s->picture.data[0] + s->picture.linesize[0]*y;
- src_ptr[1] = s->picture.data[1] + s->picture.linesize[1]*cy;
- src_ptr[2] = s->picture.data[2] + s->picture.linesize[2]*cy;
+
+ offset[0] = s->picture.linesize[0]*y;
+ offset[1] = s->picture.linesize[1]*cy;
+ offset[2] = s->picture.linesize[2]*cy;
+ offset[3] = 0;
emms_c();
- s->avctx->draw_horiz_band(s->avctx, src_ptr, s->picture.linesize[0], y, s->width, h);
+ s->avctx->draw_horiz_band(s->avctx, &s->picture, offset, y, 3, h);
s->last_slice_end= y + h;
}
if (buf_size == 0)
return 0;
- bswap_buf((uint32_t*)s->bitstream_buffer, (uint32_t*)buf, buf_size/4);
+ s->dsp.bswap_buf((uint32_t*)s->bitstream_buffer, (uint32_t*)buf, buf_size/4);
init_get_bits(&s->gb, s->bitstream_buffer, buf_size*8);
+ if(p->data[0])
+ avctx->release_buffer(avctx, p);
+
p->reference= 0;
if(avctx->get_buffer(avctx, p) < 0){
- fprintf(stderr, "get_buffer() failed\n");
+ av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
return -1;
}
p->data[0][1]= get_bits(&s->gb, 8);
p->data[0][0]= get_bits(&s->gb, 8);
- fprintf(stderr, "YUY2 output isnt implemenetd yet\n");
+ av_log(avctx, AV_LOG_ERROR, "YUY2 output isnt implemenetd yet\n");
return -1;
}else{
draw_slice(s, height); // just 1 large slice as this isnt possible in reverse order
break;
default:
- fprintf(stderr, "prediction type not supported!\n");
+ av_log(avctx, AV_LOG_ERROR, "prediction type not supported!\n");
}
}else{
- fprintf(stderr, "BGR24 output isnt implemenetd yet\n");
+ av_log(avctx, AV_LOG_ERROR, "BGR24 output isnt implemenetd yet\n");
return -1;
}
}
emms_c();
*picture= *p;
-
- avctx->release_buffer(avctx, p);
-
*data_size = sizeof(AVFrame);
return (get_bits_count(&s->gb)+31)/32*4;
for(i=0; i<3; i++){
free_vlc(&s->vlc[i]);
}
-
- if(avctx->get_buffer == avcodec_default_get_buffer){
- for(i=0; i<4; i++){
- av_freep(&s->picture.base[i]);
- s->picture.data[i]= NULL;
- }
- av_freep(&s->picture.opaque);
- }
+
+ avcodec_default_free_buffers(avctx);
return 0;
}
AVFrame * const p= &s->picture;
int i, size;
- init_put_bits(&s->pb, buf, buf_size, NULL, NULL);
+ init_put_bits(&s->pb, buf, buf_size);
*p = *pict;
p->pict_type= FF_I_TYPE;
lefttopy= p->data[0][3];
lefttopu= p->data[1][1];
lefttopv= p->data[2][1];
- sub_median_prediction(s->temp[0], p->data[0]+4, p->data[0] + fake_ystride+4, width-4 , &lefty, &lefttopy);
- sub_median_prediction(s->temp[1], p->data[1]+2, p->data[1] + fake_ustride+2, width2-2, &leftu, &lefttopu);
- sub_median_prediction(s->temp[2], p->data[2]+2, p->data[2] + fake_vstride+2, width2-2, &leftv, &lefttopv);
+ s->dsp.sub_hfyu_median_prediction(s->temp[0], p->data[0]+4, p->data[0] + fake_ystride+4, width-4 , &lefty, &lefttopy);
+ s->dsp.sub_hfyu_median_prediction(s->temp[1], p->data[1]+2, p->data[1] + fake_ustride+2, width2-2, &leftu, &lefttopu);
+ s->dsp.sub_hfyu_median_prediction(s->temp[2], p->data[2]+2, p->data[2] + fake_vstride+2, width2-2, &leftv, &lefttopv);
encode_422_bitstream(s, width-4);
y++; cy++;
if(s->bitstream_bpp==12){
while(2*cy > y){
ydst= p->data[0] + p->linesize[0]*y;
- sub_median_prediction(s->temp[0], ydst - fake_ystride, ydst, width , &lefty, &lefttopy);
+ s->dsp.sub_hfyu_median_prediction(s->temp[0], ydst - fake_ystride, ydst, width , &lefty, &lefttopy);
encode_gray_bitstream(s, width);
y++;
}
udst= p->data[1] + p->linesize[1]*cy;
vdst= p->data[2] + p->linesize[2]*cy;
- sub_median_prediction(s->temp[0], ydst - fake_ystride, ydst, width , &lefty, &lefttopy);
- sub_median_prediction(s->temp[1], udst - fake_ustride, udst, width2, &leftu, &lefttopu);
- sub_median_prediction(s->temp[2], vdst - fake_vstride, vdst, width2, &leftv, &lefttopv);
+ s->dsp.sub_hfyu_median_prediction(s->temp[0], ydst - fake_ystride, ydst, width , &lefty, &lefttopy);
+ s->dsp.sub_hfyu_median_prediction(s->temp[1], udst - fake_ustride, udst, width2, &leftu, &lefttopu);
+ s->dsp.sub_hfyu_median_prediction(s->temp[2], vdst - fake_vstride, vdst, width2, &leftv, &lefttopv);
encode_422_bitstream(s, width);
}
if(s->predictor == PLANE && s->interlaced < cy){
s->dsp.diff_bytes(s->temp[1], ydst, ydst - fake_ystride, width);
s->dsp.diff_bytes(s->temp[2], udst, udst - fake_ustride, width2);
- s->dsp.diff_bytes(s->temp[3], vdst, vdst - fake_vstride, width2);
+ s->dsp.diff_bytes(s->temp[2] + 1250, vdst, vdst - fake_vstride, width2);
lefty= sub_left_prediction(s, s->temp[0], s->temp[1], width , lefty);
leftu= sub_left_prediction(s, s->temp[1], s->temp[2], width2, leftu);
- leftv= sub_left_prediction(s, s->temp[2], s->temp[3], width2, leftv);
+ leftv= sub_left_prediction(s, s->temp[2], s->temp[2] + 1250, width2, leftv);
}else{
lefty= sub_left_prediction(s, s->temp[0], ydst, width , lefty);
leftu= sub_left_prediction(s, s->temp[1], udst, width2, leftu);
}
}
}else{
- fprintf(stderr, "Format not supported!\n");
+ av_log(avctx, AV_LOG_ERROR, "Format not supported!\n");
}
emms_c();
char *p= avctx->stats_out;
for(i=0; i<3; i++){
for(j=0; j<256; j++){
- sprintf(p, "%Ld ", s->stats[i][j]);
+ sprintf(p, "%llu ", s->stats[i][j]);
p+= strlen(p);
s->stats[i][j]= 0;
}
}
}else{
flush_put_bits(&s->pb);
- bswap_buf((uint32_t*)buf, (uint32_t*)buf, size);
+ s->dsp.bswap_buf((uint32_t*)buf, (uint32_t*)buf, size);
}
s->picture_number++;
NULL
};
+#ifdef CONFIG_ENCODERS
+
AVCodec huffyuv_encoder = {
"huffyuv",
CODEC_TYPE_VIDEO,
encode_end,
.options = huffyuv_options,
};
+
+#endif //CONFIG_ENCODERS