summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2010-01-26 18:15:58 +0000
committerreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2010-01-26 18:15:58 +0000
commitd83fb575cf06d8921758ce1fe2b20320a93d159b (patch)
tree1919c55b7b90ad472a344eba6816588d4f6ca861
parent156399b7aa25e5a8c39563fc6435de21f41dd655 (diff)
downloadmpv-d83fb575cf06d8921758ce1fe2b20320a93d159b.tar.bz2
mpv-d83fb575cf06d8921758ce1fe2b20320a93d159b.tar.xz
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
-rw-r--r--DOCS/man/en/mplayer.19
-rw-r--r--libmpcodecs/vf_cropdetect.c20
2 files changed, 24 insertions, 5 deletions
diff --git a/DOCS/man/en/mplayer.1 b/DOCS/man/en/mplayer.1
index 73eb4efa0f..aa5c72aca3 100644
--- a/DOCS/man/en/mplayer.1
+++ b/DOCS/man/en/mplayer.1
@@ -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
.
diff --git a/libmpcodecs/vf_cropdetect.c b/libmpcodecs/vf_cropdetect.c
index d0d4eb489a..7a1080b719 100644
--- a/libmpcodecs/vf_cropdetect.c
+++ b/libmpcodecs/vf_cropdetect.c
@@ -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;
}