mirror of https://github.com/FFmpeg/FFmpeg.git
The cropdetect filter is natively integrated into libavfilter.pull/2/head
parent
c76974524a
commit
8c2863b87f
5 changed files with 1 additions and 206 deletions
@ -1,201 +0,0 @@ |
||||
/*
|
||||
* This file is part of MPlayer. |
||||
* |
||||
* MPlayer is free software; you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation; either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* MPlayer is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License along |
||||
* with MPlayer; if not, write to the Free Software Foundation, Inc., |
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
||||
*/ |
||||
|
||||
#include <stdio.h> |
||||
#include <stdlib.h> |
||||
#include <string.h> |
||||
#include <inttypes.h> |
||||
|
||||
#include "config.h" |
||||
#include "mp_msg.h" |
||||
#include "help_mp.h" |
||||
|
||||
#include "img_format.h" |
||||
#include "mp_image.h" |
||||
#include "vf.h" |
||||
|
||||
struct vf_priv_s { |
||||
int x1,y1,x2,y2; |
||||
int limit; |
||||
int round; |
||||
int reset_count; |
||||
int fno; |
||||
}; |
||||
|
||||
static int checkline(unsigned char* src,int stride,int len,int bpp){ |
||||
int total=0; |
||||
int div=len; |
||||
switch(bpp){ |
||||
case 1: |
||||
while(--len>=0){ |
||||
total+=src[0]; src+=stride; |
||||
} |
||||
break; |
||||
case 3: |
||||
case 4: |
||||
while(--len>=0){ |
||||
total+=src[0]+src[1]+src[2]; src+=stride; |
||||
} |
||||
div*=3; |
||||
break; |
||||
} |
||||
total/=div; |
||||
// printf("total=%d\n",total);
|
||||
return total; |
||||
} |
||||
|
||||
//===========================================================================//
|
||||
|
||||
static int config(struct vf_instance *vf, |
||||
int width, int height, int d_width, int d_height, |
||||
unsigned int flags, unsigned int outfmt){ |
||||
vf->priv->x1=width - 1; |
||||
vf->priv->y1=height - 1; |
||||
vf->priv->x2=0; |
||||
vf->priv->y2=0; |
||||
vf->priv->fno=-2; |
||||
return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt); |
||||
} |
||||
|
||||
static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){ |
||||
mp_image_t *dmpi; |
||||
int bpp=mpi->bpp/8; |
||||
int w,h,x,y,shrink_by; |
||||
|
||||
// hope we'll get DR buffer:
|
||||
dmpi=vf_get_image(vf->next,mpi->imgfmt, |
||||
MP_IMGTYPE_EXPORT, 0, |
||||
mpi->w, mpi->h); |
||||
|
||||
dmpi->planes[0]=mpi->planes[0]; |
||||
dmpi->planes[1]=mpi->planes[1]; |
||||
dmpi->planes[2]=mpi->planes[2]; |
||||
dmpi->stride[0]=mpi->stride[0]; |
||||
dmpi->stride[1]=mpi->stride[1]; |
||||
dmpi->stride[2]=mpi->stride[2]; |
||||
dmpi->width=mpi->width; |
||||
dmpi->height=mpi->height; |
||||
|
||||
if(++vf->priv->fno>0){ // ignore first 2 frames - they may be empty
|
||||
|
||||
// Reset the crop area every reset_count frames, if reset_count is > 0
|
||||
if(vf->priv->reset_count > 0 && vf->priv->fno > vf->priv->reset_count){ |
||||
vf->priv->x1=mpi->w-1; |
||||
vf->priv->y1=mpi->h-1; |
||||
vf->priv->x2=0; |
||||
vf->priv->y2=0; |
||||
vf->priv->fno=1; |
||||
} |
||||
|
||||
for(y=0;y<vf->priv->y1;y++){ |
||||
if(checkline(mpi->planes[0]+mpi->stride[0]*y,bpp,mpi->w,bpp)>vf->priv->limit){ |
||||
vf->priv->y1=y; |
||||
break; |
||||
} |
||||
} |
||||
|
||||
for(y=mpi->h-1;y>vf->priv->y2;y--){ |
||||
if(checkline(mpi->planes[0]+mpi->stride[0]*y,bpp,mpi->w,bpp)>vf->priv->limit){ |
||||
vf->priv->y2=y; |
||||
break; |
||||
} |
||||
} |
||||
|
||||
for(y=0;y<vf->priv->x1;y++){ |
||||
if(checkline(mpi->planes[0]+bpp*y,mpi->stride[0],mpi->h,bpp)>vf->priv->limit){ |
||||
vf->priv->x1=y; |
||||
break; |
||||
} |
||||
} |
||||
|
||||
for(y=mpi->w-1;y>vf->priv->x2;y--){ |
||||
if(checkline(mpi->planes[0]+bpp*y,mpi->stride[0],mpi->h,bpp)>vf->priv->limit){ |
||||
vf->priv->x2=y; |
||||
break; |
||||
} |
||||
} |
||||
|
||||
// round x and y (up), important for yuv colorspaces
|
||||
// make sure they stay rounded!
|
||||
x=(vf->priv->x1+1)&(~1); |
||||
y=(vf->priv->y1+1)&(~1); |
||||
|
||||
w = vf->priv->x2 - x + 1; |
||||
h = vf->priv->y2 - y + 1; |
||||
|
||||
// w and h must be divisible by 2 as well because of yuv
|
||||
// colorspace problems.
|
||||
if (vf->priv->round <= 1) |
||||
vf->priv->round = 16; |
||||
if (vf->priv->round % 2) |
||||
vf->priv->round *= 2; |
||||
|
||||
shrink_by = w % vf->priv->round; |
||||
w -= shrink_by; |
||||
x += (shrink_by / 2 + 1) & ~1; |
||||
|
||||
shrink_by = h % vf->priv->round; |
||||
h -= shrink_by; |
||||
y += (shrink_by / 2 + 1) & ~1; |
||||
|
||||
mp_msg(MSGT_VFILTER, MSGL_INFO, MSGTR_MPCODECS_CropArea, |
||||
vf->priv->x1,vf->priv->x2, |
||||
vf->priv->y1,vf->priv->y2, |
||||
w,h,x,y); |
||||
|
||||
|
||||
} |
||||
|
||||
return vf_next_put_image(vf,dmpi, pts); |
||||
} |
||||
|
||||
static int query_format(struct vf_instance *vf, unsigned int fmt) { |
||||
switch(fmt) { |
||||
// the default limit value works only right with YV12 right now.
|
||||
case IMGFMT_YV12: |
||||
return vf_next_query_format(vf, fmt); |
||||
} |
||||
return 0; |
||||
} |
||||
//===========================================================================//
|
||||
|
||||
static int vf_open(vf_instance_t *vf, char *args){ |
||||
vf->config=config; |
||||
vf->put_image=put_image; |
||||
vf->query_format=query_format; |
||||
vf->priv=malloc(sizeof(struct vf_priv_s)); |
||||
vf->priv->limit=24; // should be option
|
||||
vf->priv->round = 0; |
||||
vf->priv->reset_count = 0; |
||||
if(args) sscanf(args, "%d:%d:%d", |
||||
&vf->priv->limit, |
||||
&vf->priv->round, |
||||
&vf->priv->reset_count); |
||||
return 1; |
||||
} |
||||
|
||||
const vf_info_t vf_info_cropdetect = { |
||||
"autodetect crop size", |
||||
"cropdetect", |
||||
"A'rpi", |
||||
"", |
||||
vf_open, |
||||
NULL |
||||
}; |
||||
|
||||
//===========================================================================//
|
Loading…
Reference in new issue