1
mirror of https://github.com/mpv-player/mpv synced 2024-12-28 06:03:45 +01:00

Add an option to cropdetect to periodically reset the detected area.

Patch by [quetschke scytek de] with modifications by me.


git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@30436 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
reimar 2010-01-26 18:15:58 +00:00
parent 156399b7aa
commit d83fb575cf
2 changed files with 24 additions and 5 deletions

View File

@ -5775,7 +5775,7 @@ Position of the cropped picture, defaults to center.
.PD 1
.
.TP
.B cropdetect[=limit:round]
.B cropdetect[=limit:round[:reset]]
Calculates necessary cropping parameters and prints the recommended parameters
to stdout.
.PD 0
@ -5789,6 +5789,13 @@ Value which the width/\:height should be divisible by (default: 16).
The offset is automatically adjusted to center the video.
Use 2 to get only even dimensions (needed for 4:2:2 video).
16 is best when encoding to most video codecs.
.br
.IPs <reset>
Counter that determines after how many frames cropdetect will reset
the previously detected largest video area and start over to detect
the current optimal crop area. This can be useful when channel
logos distort the video area. 0 indicates never reset and return
the largest area encountered during playback. (default: 0).
.RE
.PD 1
.

View File

@ -15,6 +15,7 @@ struct vf_priv_s {
int x1,y1,x2,y2;
int limit;
int round;
int reset_count;
int fno;
};
@ -49,7 +50,7 @@ static int config(struct vf_instance_s* vf,
vf->priv->y1=height - 1;
vf->priv->x2=0;
vf->priv->y2=0;
vf->priv->fno=0;
vf->priv->fno=-2;
return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt);
}
@ -72,7 +73,16 @@ static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts){
dmpi->width=mpi->width;
dmpi->height=mpi->height;
if(++vf->priv->fno>2){ // ignore first 2 frames - they may be empty
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){
@ -153,9 +163,11 @@ static int open(vf_instance_t *vf, char* args){
vf->priv=malloc(sizeof(struct vf_priv_s));
vf->priv->limit=24; // should be option
vf->priv->round = 0;
if(args) sscanf(args, "%d:%d",
vf->priv->reset_count = 0;
if(args) sscanf(args, "%d:%d:%d",
&vf->priv->limit,
&vf->priv->round);
&vf->priv->round,
&vf->priv->reset_count);
return 1;
}