annotate libmpcodecs/vf_blackframe.c @ 26591:0f069e41d8d2

Allow inexact font family matching. In SSA/ASS fonts are sometimes referenced by their "full name", which is usually a concatenation of family name and font style (ex. Ottawa Bold). Full name is available from FontConfig pattern element FC_FULLNAME, but it is never used for font matching. Therefore, I'm removing words from the end of the name one by one, and adding shortened names to the pattern. It seems that the first value (full name in this case) has precedence in matching.
author eugeni
date Thu, 01 May 2008 00:34:26 +0000
parents c2b7ba444ade
children 82601a38e2a7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
19094
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
1 /* vf_blackframe.c - detect frames that are (almost) black
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
2 *
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
3 * $Id$
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
4 *
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
5 * search for black frames to detect scene transitions
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
6 * (c) 2006 Julian Hall
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
7 *
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
8 * based on code designed for skipping commercials
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
9 * (c) 2002-2003 Brian J. Murrell
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
10 *
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
11 * cleanup, simplify, speedup (c) 2006 by Ivo van Poorten
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
12 *
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
13 * This program is free software; you can redistribute it and/or modify
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
14 * it under the terms of the GNU General Public License as published by
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
15 * the Free Software Foundation; either version 2 of the License, or
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
16 * (at your option) any later version.
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
17 *
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
18 * This program is distributed in the hope that it will be useful,
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
21 * GNU General Public License for more details.
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
22 *
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
23 * You should have received a copy of the GNU General Public License
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
24 * along with this program; if not, write to the Free Software
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
25 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
26 */
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
27
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
28 #include <stdio.h>
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
29 #include <stdlib.h>
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
30 #include <string.h>
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
31
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
32 #include "config.h"
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
33 #include "mp_msg.h"
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
34
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
35 #include "img_format.h"
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
36 #include "mp_image.h"
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
37 #include "vf.h"
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
38
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
39 struct vf_priv_s {
19096
30084f256717 print frame type and keep track of last encountered keyframe
ivo
parents: 19094
diff changeset
40 unsigned int bamount, bthresh, frame, lastkeyframe;
19094
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
41 };
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
42
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
43 static int config(struct vf_instance_s* vf, int width, int height, int d_width,
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
44 int d_height, unsigned int flags, unsigned int outfmt) {
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
45 return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt);
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
46 }
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
47
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
48 static int query_format(struct vf_instance_s *vf, unsigned fmt) {
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
49 switch(fmt) {
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
50 case IMGFMT_YVU9:
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
51 case IMGFMT_IF09:
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
52 case IMGFMT_YV12:
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
53 case IMGFMT_I420:
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
54 case IMGFMT_IYUV:
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
55 case IMGFMT_CLPL:
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
56 case IMGFMT_Y800:
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
57 case IMGFMT_Y8:
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
58 case IMGFMT_NV12:
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
59 case IMGFMT_NV21:
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
60 case IMGFMT_444P:
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
61 case IMGFMT_422P:
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
62 case IMGFMT_411P:
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
63 case IMGFMT_HM12:
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
64 return vf_next_query_format(vf, fmt);
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
65 }
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
66 return 0;
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
67 }
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
68
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
69 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts){
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
70 mp_image_t *dmpi;
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
71 int x, y;
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
72 int nblack=0, pblack=0;
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
73 unsigned char *yplane = mpi->planes[0];
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
74 unsigned int ystride = mpi->stride[0];
19096
30084f256717 print frame type and keep track of last encountered keyframe
ivo
parents: 19094
diff changeset
75 int pict_type = mpi->pict_type;
19094
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
76 int w = mpi->w, h = mpi->h;
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
77 int bthresh = vf->priv->bthresh;
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
78 int bamount = vf->priv->bamount;
24969
c2b7ba444ade begin moving const filter data to .text/.rodata sections
rfelker
parents: 19096
diff changeset
79 static const char *const picttypes[4] = { "unknown", "I", "P", "B" };
19094
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
80
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
81 for (y=1; y<=h; y++) {
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
82 for (x=0; x<w; x++)
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
83 nblack += yplane[x] < bthresh;
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
84 pblack = nblack*100/(w*y);
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
85 if (pblack < bamount) break;
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
86 yplane += ystride;
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
87 }
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
88
19096
30084f256717 print frame type and keep track of last encountered keyframe
ivo
parents: 19094
diff changeset
89 if (pict_type > 3 || pict_type < 0) pict_type = 0;
30084f256717 print frame type and keep track of last encountered keyframe
ivo
parents: 19094
diff changeset
90 if (pict_type == 1) vf->priv->lastkeyframe = vf->priv->frame;
30084f256717 print frame type and keep track of last encountered keyframe
ivo
parents: 19094
diff changeset
91
19094
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
92 if (pblack >= bamount)
19096
30084f256717 print frame type and keep track of last encountered keyframe
ivo
parents: 19094
diff changeset
93 mp_msg(MSGT_VFILTER, MSGL_INFO,"vf_blackframe: %u, %i%%, %s (I:%u)\n",
30084f256717 print frame type and keep track of last encountered keyframe
ivo
parents: 19094
diff changeset
94 vf->priv->frame, pblack, picttypes[pict_type],
30084f256717 print frame type and keep track of last encountered keyframe
ivo
parents: 19094
diff changeset
95 vf->priv->lastkeyframe);
19094
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
96
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
97 vf->priv->frame++;
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
98
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
99 dmpi = vf_get_image(vf->next, mpi->imgfmt, MP_IMGTYPE_EXPORT, 0,
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
100 mpi->width, mpi->height);
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
101 dmpi->planes[0] = mpi->planes[0];
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
102 dmpi->stride[0] = mpi->stride[0];
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
103 dmpi->planes[1] = mpi->planes[1];
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
104 dmpi->stride[1] = mpi->stride[1];
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
105 dmpi->planes[2] = mpi->planes[2];
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
106 dmpi->stride[2] = mpi->stride[2];
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
107
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
108 vf_clone_mpi_attributes(dmpi, mpi);
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
109
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
110 return vf_next_put_image(vf, dmpi, pts);
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
111 }
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
112
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
113 static int control(struct vf_instance_s* vf, int request, void* data){
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
114 return vf_next_control(vf,request,data);
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
115 }
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
116
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
117 static void uninit(struct vf_instance_s *vf) {
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
118 if (vf->priv) free(vf->priv);
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
119 }
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
120
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
121 static int open(vf_instance_t *vf, char* args){
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
122 vf->priv = malloc(sizeof(struct vf_priv_s));
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
123 if (!vf->priv) return 0;
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
124
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
125 vf->config = config;
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
126 vf->put_image = put_image;
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
127 vf->control = control;
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
128 vf->uninit = uninit;
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
129 vf->query_format = query_format;
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
130
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
131 vf->priv->bamount = 98;
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
132 vf->priv->bthresh = 0x20;
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
133 vf->priv->frame = 0;
19096
30084f256717 print frame type and keep track of last encountered keyframe
ivo
parents: 19094
diff changeset
134 vf->priv->lastkeyframe = 0;
19094
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
135
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
136 if (args)
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
137 sscanf(args, "%u:%u", &vf->priv->bamount, &vf->priv->bthresh);
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
138 return 1;
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
139 }
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
140
24969
c2b7ba444ade begin moving const filter data to .text/.rodata sections
rfelker
parents: 19096
diff changeset
141 const vf_info_t vf_info_blackframe = {
19094
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
142 "detects black frames",
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
143 "blackframe",
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
144 "Brian J. Murrell, Julian Hall, Ivo van Poorten",
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
145 "Useful for detecting scene transitions",
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
146 open,
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
147 NULL
e84360ee61c9 new black frame detection filter
ivo
parents:
diff changeset
148 };