---
libavcodec/snow.c | 146 ++++++++++++++++++++++++++++++++++++++++++++++++
libavcodec/snow.h | 7 ++-
libavcodec/snowdec.c | 151 +-------------------------------------------------
libavcodec/snowenc.c | 151 +-------------------------------------------------
4 files changed, 157 insertions(+), 298 deletions(-)
diff --git a/libavcodec/snow.c b/libavcodec/snow.c
index c4d8717..5ee543e 100644
--- a/libavcodec/snow.c
+++ b/libavcodec/snow.c
@@ -504,4 +504,150 @@ int snow_common_init_after_header(AVCodecContext *avctx) {
return 0;
}
+#define USE_HALFPEL_PLANE 0
+
+static void halfpel_interpol(SnowContext *s, uint8_t *halfpel[4][4], AVFrame
*frame){
+ int p,x,y;
+
+ for(p=0; p<3; p++){
+ int is_chroma= !!p;
+ int w= s->avctx->width >>is_chroma;
+ int h= s->avctx->height >>is_chroma;
+ int ls= frame->linesize[p];
+ uint8_t *src= frame->data[p];
+
+ halfpel[1][p]= (uint8_t*)av_malloc(ls * (h+2*EDGE_WIDTH)) +
EDGE_WIDTH*(1+ls);
+ halfpel[2][p]= (uint8_t*)av_malloc(ls * (h+2*EDGE_WIDTH)) +
EDGE_WIDTH*(1+ls);
+ halfpel[3][p]= (uint8_t*)av_malloc(ls * (h+2*EDGE_WIDTH)) +
EDGE_WIDTH*(1+ls);
+
+ halfpel[0][p]= src;
+ for(y=0; y<h; y++){
+ for(x=0; x<w; x++){
+ int i= y*ls + x;
+
+ halfpel[1][p][i]= (20*(src[i] + src[i+1]) - 5*(src[i-1] +
src[i+2]) + (src[i-2] + src[i+3]) + 16 )>>5;
+ }
+ }
+ for(y=0; y<h; y++){
+ for(x=0; x<w; x++){
+ int i= y*ls + x;
+
+ halfpel[2][p][i]= (20*(src[i] + src[i+ls]) - 5*(src[i-ls] +
src[i+2*ls]) + (src[i-2*ls] + src[i+3*ls]) + 16 )>>5;
+ }
+ }
+ src= halfpel[1][p];
+ for(y=0; y<h; y++){
+ for(x=0; x<w; x++){
+ int i= y*ls + x;
+
+ halfpel[3][p][i]= (20*(src[i] + src[i+ls]) - 5*(src[i-ls] +
src[i+2*ls]) + (src[i-2*ls] + src[i+3*ls]) + 16 )>>5;
+ }
+ }
+
+//FIXME border!
+ }
+}
+
+void snow_release_buffer(AVCodecContext *avctx)
+{
+ SnowContext *s = avctx->priv_data;
+ int i;
+
+ if(s->last_picture[s->max_ref_frames-1].data[0]){
+ avctx->release_buffer(avctx, &s->last_picture[s->max_ref_frames-1]);
+ for(i=0; i<9; i++)
+ if(s->halfpel_plane[s->max_ref_frames-1][1+i/3][i%3])
+ av_free(s->halfpel_plane[s->max_ref_frames-1][1+i/3][i%3] -
EDGE_WIDTH*(1+s->current_picture.linesize[i%3]));
+ }
+}
+
+int snow_frame_start(SnowContext *s){
+ AVFrame tmp;
+ int w= s->avctx->width; //FIXME round up to x16 ?
+ int h= s->avctx->height;
+
+ if (s->current_picture.data[0] && !(s->avctx->flags&CODEC_FLAG_EMU_EDGE)) {
+ s->dsp.draw_edges(s->current_picture.data[0],
+ s->current_picture.linesize[0], w , h ,
+ EDGE_WIDTH , EDGE_WIDTH , EDGE_TOP | EDGE_BOTTOM);
+ s->dsp.draw_edges(s->current_picture.data[1],
+ s->current_picture.linesize[1], w>>1, h>>1,
+ EDGE_WIDTH/2, EDGE_WIDTH/2, EDGE_TOP | EDGE_BOTTOM);
+ s->dsp.draw_edges(s->current_picture.data[2],
+ s->current_picture.linesize[2], w>>1, h>>1,
+ EDGE_WIDTH/2, EDGE_WIDTH/2, EDGE_TOP | EDGE_BOTTOM);
+ }
+
+ snow_release_buffer(s->avctx);
+
+ tmp= s->last_picture[s->max_ref_frames-1];
+ memmove(s->last_picture+1, s->last_picture,
(s->max_ref_frames-1)*sizeof(AVFrame));
+ memmove(s->halfpel_plane+1, s->halfpel_plane,
(s->max_ref_frames-1)*sizeof(void*)*4*4);
+ if(USE_HALFPEL_PLANE && s->current_picture.data[0])
+ halfpel_interpol(s, s->halfpel_plane[0], &s->current_picture);
+ s->last_picture[0]= s->current_picture;
+ s->current_picture= tmp;
+
+ if(s->keyframe){
+ s->ref_frames= 0;
+ }else{
+ int i;
+ for(i=0; i<s->max_ref_frames && s->last_picture[i].data[0]; i++)
+ if(i && s->last_picture[i-1].key_frame)
+ break;
+ s->ref_frames= i;
+ if(s->ref_frames==0){
+ av_log(s->avctx,AV_LOG_ERROR, "No reference frames\n");
+ return -1;
+ }
+ }
+
+ s->current_picture.reference= 1;
+ if(s->avctx->get_buffer(s->avctx, &s->current_picture) < 0){
+ av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
+ return -1;
+ }
+
+ s->current_picture.key_frame= s->keyframe;
+
+ return 0;
+}
+
+av_cold void snow_common_end(SnowContext *s)
+{
+ int plane_index, level, orientation, i;
+
+ av_freep(&s->spatial_dwt_buffer);
+ av_freep(&s->spatial_idwt_buffer);
+
+ s->m.me.temp= NULL;
+ av_freep(&s->m.me.scratchpad);
+ av_freep(&s->m.me.map);
+ av_freep(&s->m.me.score_map);
+ av_freep(&s->m.obmc_scratchpad);
+
+ av_freep(&s->block);
+ av_freep(&s->scratchbuf);
+
+ for(i=0; i<MAX_REF_FRAMES; i++){
+ av_freep(&s->ref_mvs[i]);
+ av_freep(&s->ref_scores[i]);
+ if(s->last_picture[i].data[0])
+ s->avctx->release_buffer(s->avctx, &s->last_picture[i]);
+ }
+
+ for(plane_index=0; plane_index<3; plane_index++){
+ for(level=s->spatial_decomposition_count-1; level>=0; level--){
+ for(orientation=level ? 1 : 0; orientation<4; orientation++){
+ SubBand *b= &s->plane[plane_index].band[level][orientation];
+
+ av_freep(&b->x_coeff);
+ }
+ }
+ }
+ if (s->mconly_picture.data[0])
+ s->avctx->release_buffer(s->avctx, &s->mconly_picture);
+ if (s->current_picture.data[0])
+ s->avctx->release_buffer(s->avctx, &s->current_picture);
+}
diff --git a/libavcodec/snow.h b/libavcodec/snow.h
index 0fa5a37..971fce3 100644
--- a/libavcodec/snow.h
+++ b/libavcodec/snow.h
@@ -213,13 +213,16 @@ static av_always_inline void
snow_horizontal_compose_liftS_lead_out(int i, IDWTE
/* common code */
+int snow_common_init(AVCodecContext *avctx);
+int snow_common_init_after_header(AVCodecContext *avctx);
+void snow_common_end(SnowContext *s);
+void snow_release_buffer(AVCodecContext *avctx);
void snow_reset_contexts(SnowContext *s);
int snow_alloc_blocks(SnowContext *s);
-int snow_common_init(AVCodecContext *avctx);
+int snow_frame_start(SnowContext *s);
void snow_pred_block(SnowContext *s, uint8_t *dst, uint8_t *tmp, int stride,
int sx, int sy, int b_w, int b_h, BlockNode *block,
int plane_index, int w, int h);
-int snow_common_init_after_header(AVCodecContext *avctx);
/* common inline functions */
//XXX doublecheck all of them should stay inlined
diff --git a/libavcodec/snowdec.c b/libavcodec/snowdec.c
index e2ecf98..f2cc7db 100644
--- a/libavcodec/snowdec.c
+++ b/libavcodec/snowdec.c
@@ -588,151 +588,6 @@ static int decode_header(SnowContext *s){
return 0;
}
-#define USE_HALFPEL_PLANE 0
-
-static void halfpel_interpol(SnowContext *s, uint8_t *halfpel[4][4], AVFrame
*frame){
- int p,x,y;
-
- for(p=0; p<3; p++){
- int is_chroma= !!p;
- int w= s->avctx->width >>is_chroma;
- int h= s->avctx->height >>is_chroma;
- int ls= frame->linesize[p];
- uint8_t *src= frame->data[p];
-
- halfpel[1][p]= (uint8_t*)av_malloc(ls * (h+2*EDGE_WIDTH)) +
EDGE_WIDTH*(1+ls);
- halfpel[2][p]= (uint8_t*)av_malloc(ls * (h+2*EDGE_WIDTH)) +
EDGE_WIDTH*(1+ls);
- halfpel[3][p]= (uint8_t*)av_malloc(ls * (h+2*EDGE_WIDTH)) +
EDGE_WIDTH*(1+ls);
-
- halfpel[0][p]= src;
- for(y=0; y<h; y++){
- for(x=0; x<w; x++){
- int i= y*ls + x;
-
- halfpel[1][p][i]= (20*(src[i] + src[i+1]) - 5*(src[i-1] +
src[i+2]) + (src[i-2] + src[i+3]) + 16 )>>5;
- }
- }
- for(y=0; y<h; y++){
- for(x=0; x<w; x++){
- int i= y*ls + x;
-
- halfpel[2][p][i]= (20*(src[i] + src[i+ls]) - 5*(src[i-ls] +
src[i+2*ls]) + (src[i-2*ls] + src[i+3*ls]) + 16 )>>5;
- }
- }
- src= halfpel[1][p];
- for(y=0; y<h; y++){
- for(x=0; x<w; x++){
- int i= y*ls + x;
-
- halfpel[3][p][i]= (20*(src[i] + src[i+ls]) - 5*(src[i-ls] +
src[i+2*ls]) + (src[i-2*ls] + src[i+3*ls]) + 16 )>>5;
- }
- }
-
-//FIXME border!
- }
-}
-
-static void release_buffer(AVCodecContext *avctx){
- SnowContext *s = avctx->priv_data;
- int i;
-
- if(s->last_picture[s->max_ref_frames-1].data[0]){
- avctx->release_buffer(avctx, &s->last_picture[s->max_ref_frames-1]);
- for(i=0; i<9; i++)
- if(s->halfpel_plane[s->max_ref_frames-1][1+i/3][i%3])
- av_free(s->halfpel_plane[s->max_ref_frames-1][1+i/3][i%3] -
EDGE_WIDTH*(1+s->current_picture.linesize[i%3]));
- }
-}
-
-static int frame_start(SnowContext *s){
- AVFrame tmp;
- int w= s->avctx->width; //FIXME round up to x16 ?
- int h= s->avctx->height;
-
- if (s->current_picture.data[0] && !(s->avctx->flags&CODEC_FLAG_EMU_EDGE)) {
- s->dsp.draw_edges(s->current_picture.data[0],
- s->current_picture.linesize[0], w , h ,
- EDGE_WIDTH , EDGE_WIDTH , EDGE_TOP | EDGE_BOTTOM);
- s->dsp.draw_edges(s->current_picture.data[1],
- s->current_picture.linesize[1], w>>1, h>>1,
- EDGE_WIDTH/2, EDGE_WIDTH/2, EDGE_TOP | EDGE_BOTTOM);
- s->dsp.draw_edges(s->current_picture.data[2],
- s->current_picture.linesize[2], w>>1, h>>1,
- EDGE_WIDTH/2, EDGE_WIDTH/2, EDGE_TOP | EDGE_BOTTOM);
- }
-
- release_buffer(s->avctx);
-
- tmp= s->last_picture[s->max_ref_frames-1];
- memmove(s->last_picture+1, s->last_picture,
(s->max_ref_frames-1)*sizeof(AVFrame));
- memmove(s->halfpel_plane+1, s->halfpel_plane,
(s->max_ref_frames-1)*sizeof(void*)*4*4);
- if(USE_HALFPEL_PLANE && s->current_picture.data[0])
- halfpel_interpol(s, s->halfpel_plane[0], &s->current_picture);
- s->last_picture[0]= s->current_picture;
- s->current_picture= tmp;
-
- if(s->keyframe){
- s->ref_frames= 0;
- }else{
- int i;
- for(i=0; i<s->max_ref_frames && s->last_picture[i].data[0]; i++)
- if(i && s->last_picture[i-1].key_frame)
- break;
- s->ref_frames= i;
- if(s->ref_frames==0){
- av_log(s->avctx,AV_LOG_ERROR, "No reference frames\n");
- return -1;
- }
- }
-
- s->current_picture.reference= 1;
- if(s->avctx->get_buffer(s->avctx, &s->current_picture) < 0){
- av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
- return -1;
- }
-
- s->current_picture.key_frame= s->keyframe;
-
- return 0;
-}
-
-static av_cold void common_end(SnowContext *s){
- int plane_index, level, orientation, i;
-
- av_freep(&s->spatial_dwt_buffer);
- av_freep(&s->spatial_idwt_buffer);
-
- s->m.me.temp= NULL;
- av_freep(&s->m.me.scratchpad);
- av_freep(&s->m.me.map);
- av_freep(&s->m.me.score_map);
- av_freep(&s->m.obmc_scratchpad);
-
- av_freep(&s->block);
- av_freep(&s->scratchbuf);
-
- for(i=0; i<MAX_REF_FRAMES; i++){
- av_freep(&s->ref_mvs[i]);
- av_freep(&s->ref_scores[i]);
- if(s->last_picture[i].data[0])
- s->avctx->release_buffer(s->avctx, &s->last_picture[i]);
- }
-
- for(plane_index=0; plane_index<3; plane_index++){
- for(level=s->spatial_decomposition_count-1; level>=0; level--){
- for(orientation=level ? 1 : 0; orientation<4; orientation++){
- SubBand *b= &s->plane[plane_index].band[level][orientation];
-
- av_freep(&b->x_coeff);
- }
- }
- }
- if (s->mconly_picture.data[0])
- s->avctx->release_buffer(s->avctx, &s->mconly_picture);
- if (s->current_picture.data[0])
- s->avctx->release_buffer(s->avctx, &s->current_picture);
-}
-
static av_cold int decode_init(AVCodecContext *avctx)
{
avctx->pix_fmt= PIX_FMT_YUV420P;
@@ -784,7 +639,7 @@ static int decode_frame(AVCodecContext *avctx, void *data,
int *data_size, AVPac
snow_alloc_blocks(s);
- if(frame_start(s) < 0)
+ if(snow_frame_start(s) < 0)
return -1;
//keyframe flag duplication mess FIXME
if(avctx->debug&FF_DEBUG_PICT_INFO)
@@ -900,7 +755,7 @@ static int decode_frame(AVCodecContext *avctx, void *data,
int *data_size, AVPac
emms_c();
- release_buffer(avctx);
+ snow_release_buffer(avctx);
if(!(s->avctx->debug&2048))
*picture= s->current_picture;
@@ -921,7 +776,7 @@ static av_cold int decode_end(AVCodecContext *avctx)
ff_slice_buffer_destroy(&s->sb);
- common_end(s);
+ snow_common_end(s);
return 0;
}
diff --git a/libavcodec/snowenc.c b/libavcodec/snowenc.c
index 3ccdaf9..61830b0 100644
--- a/libavcodec/snowenc.c
+++ b/libavcodec/snowenc.c
@@ -400,151 +400,6 @@ static void dwt_quantize(SnowContext *s, Plane *p,
DWTELEM *buffer, int width, i
#endif /* QUANTIZE2==1 */
-#define USE_HALFPEL_PLANE 0
-
-static void halfpel_interpol(SnowContext *s, uint8_t *halfpel[4][4], AVFrame
*frame){
- int p,x,y;
-
- for(p=0; p<3; p++){
- int is_chroma= !!p;
- int w= s->avctx->width >>is_chroma;
- int h= s->avctx->height >>is_chroma;
- int ls= frame->linesize[p];
- uint8_t *src= frame->data[p];
-
- halfpel[1][p]= (uint8_t*)av_malloc(ls * (h+2*EDGE_WIDTH)) +
EDGE_WIDTH*(1+ls);
- halfpel[2][p]= (uint8_t*)av_malloc(ls * (h+2*EDGE_WIDTH)) +
EDGE_WIDTH*(1+ls);
- halfpel[3][p]= (uint8_t*)av_malloc(ls * (h+2*EDGE_WIDTH)) +
EDGE_WIDTH*(1+ls);
-
- halfpel[0][p]= src;
- for(y=0; y<h; y++){
- for(x=0; x<w; x++){
- int i= y*ls + x;
-
- halfpel[1][p][i]= (20*(src[i] + src[i+1]) - 5*(src[i-1] +
src[i+2]) + (src[i-2] + src[i+3]) + 16 )>>5;
- }
- }
- for(y=0; y<h; y++){
- for(x=0; x<w; x++){
- int i= y*ls + x;
-
- halfpel[2][p][i]= (20*(src[i] + src[i+ls]) - 5*(src[i-ls] +
src[i+2*ls]) + (src[i-2*ls] + src[i+3*ls]) + 16 )>>5;
- }
- }
- src= halfpel[1][p];
- for(y=0; y<h; y++){
- for(x=0; x<w; x++){
- int i= y*ls + x;
-
- halfpel[3][p][i]= (20*(src[i] + src[i+ls]) - 5*(src[i-ls] +
src[i+2*ls]) + (src[i-2*ls] + src[i+3*ls]) + 16 )>>5;
- }
- }
-
-//FIXME border!
- }
-}
-
-static void release_buffer(AVCodecContext *avctx){
- SnowContext *s = avctx->priv_data;
- int i;
-
- if(s->last_picture[s->max_ref_frames-1].data[0]){
- avctx->release_buffer(avctx, &s->last_picture[s->max_ref_frames-1]);
- for(i=0; i<9; i++)
- if(s->halfpel_plane[s->max_ref_frames-1][1+i/3][i%3])
- av_free(s->halfpel_plane[s->max_ref_frames-1][1+i/3][i%3] -
EDGE_WIDTH*(1+s->current_picture.linesize[i%3]));
- }
-}
-
-static int frame_start(SnowContext *s){
- AVFrame tmp;
- int w= s->avctx->width; //FIXME round up to x16 ?
- int h= s->avctx->height;
-
- if (s->current_picture.data[0] && !(s->avctx->flags&CODEC_FLAG_EMU_EDGE)) {
- s->dsp.draw_edges(s->current_picture.data[0],
- s->current_picture.linesize[0], w , h ,
- EDGE_WIDTH , EDGE_WIDTH , EDGE_TOP | EDGE_BOTTOM);
- s->dsp.draw_edges(s->current_picture.data[1],
- s->current_picture.linesize[1], w>>1, h>>1,
- EDGE_WIDTH/2, EDGE_WIDTH/2, EDGE_TOP | EDGE_BOTTOM);
- s->dsp.draw_edges(s->current_picture.data[2],
- s->current_picture.linesize[2], w>>1, h>>1,
- EDGE_WIDTH/2, EDGE_WIDTH/2, EDGE_TOP | EDGE_BOTTOM);
- }
-
- release_buffer(s->avctx);
-
- tmp= s->last_picture[s->max_ref_frames-1];
- memmove(s->last_picture+1, s->last_picture,
(s->max_ref_frames-1)*sizeof(AVFrame));
- memmove(s->halfpel_plane+1, s->halfpel_plane,
(s->max_ref_frames-1)*sizeof(void*)*4*4);
- if(USE_HALFPEL_PLANE && s->current_picture.data[0])
- halfpel_interpol(s, s->halfpel_plane[0], &s->current_picture);
- s->last_picture[0]= s->current_picture;
- s->current_picture= tmp;
-
- if(s->keyframe){
- s->ref_frames= 0;
- }else{
- int i;
- for(i=0; i<s->max_ref_frames && s->last_picture[i].data[0]; i++)
- if(i && s->last_picture[i-1].key_frame)
- break;
- s->ref_frames= i;
- if(s->ref_frames==0){
- av_log(s->avctx,AV_LOG_ERROR, "No reference frames\n");
- return -1;
- }
- }
-
- s->current_picture.reference= 1;
- if(s->avctx->get_buffer(s->avctx, &s->current_picture) < 0){
- av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
- return -1;
- }
-
- s->current_picture.key_frame= s->keyframe;
-
- return 0;
-}
-
-static av_cold void common_end(SnowContext *s){
- int plane_index, level, orientation, i;
-
- av_freep(&s->spatial_dwt_buffer);
- av_freep(&s->spatial_idwt_buffer);
-
- s->m.me.temp= NULL;
- av_freep(&s->m.me.scratchpad);
- av_freep(&s->m.me.map);
- av_freep(&s->m.me.score_map);
- av_freep(&s->m.obmc_scratchpad);
-
- av_freep(&s->block);
- av_freep(&s->scratchbuf);
-
- for(i=0; i<MAX_REF_FRAMES; i++){
- av_freep(&s->ref_mvs[i]);
- av_freep(&s->ref_scores[i]);
- if(s->last_picture[i].data[0])
- s->avctx->release_buffer(s->avctx, &s->last_picture[i]);
- }
-
- for(plane_index=0; plane_index<3; plane_index++){
- for(level=s->spatial_decomposition_count-1; level>=0; level--){
- for(orientation=level ? 1 : 0; orientation<4; orientation++){
- SubBand *b= &s->plane[plane_index].band[level][orientation];
-
- av_freep(&b->x_coeff);
- }
- }
- }
- if (s->mconly_picture.data[0])
- s->avctx->release_buffer(s->avctx, &s->mconly_picture);
- if (s->current_picture.data[0])
- s->avctx->release_buffer(s->avctx, &s->current_picture);
-}
-
#if CONFIG_SNOW_ENCODER
static av_cold int encode_init(AVCodecContext *avctx)
{
@@ -2040,7 +1895,7 @@ static int encode_frame(AVCodecContext *avctx, unsigned
char *buf, int buf_size,
s->lambda = 0;
}//else keep previous frame's qlog until after motion estimation
- frame_start(s);
+ snow_frame_start(s);
s->m.current_picture_ptr= &s->m.current_picture;
s->m.last_picture.f.pts = s->m.current_picture.f.pts;
@@ -2241,7 +2096,7 @@ redo_frame:
update_last_header_values(s);
- release_buffer(avctx);
+ snow_release_buffer(avctx);
s->current_picture.coded_picture_number = avctx->frame_number;
s->current_picture.pict_type = pict->pict_type;
@@ -2272,7 +2127,7 @@ static av_cold int encode_end(AVCodecContext *avctx)
{
SnowContext *s = avctx->priv_data;
- common_end(s);
+ snow_common_end(s);
if (s->input_picture.data[0])
avctx->release_buffer(avctx, &s->input_picture);
av_free(avctx->stats_out);
--
1.7.7
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel