annotate libmpcodecs/vf_framestep.c @ 22998:85343b921fef

Fix preprocessor conditionals: libdvdnav includes libdvdread and configure enables libdvdread support if libdvdnav is found. There is no need to check separately in the source with the preprocessor.
author diego
date Wed, 18 Apr 2007 09:56:24 +0000
parents d3b0e55b0c90
children f8d4f8eff72b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10751
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
1 /*
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
2 * vf_fstep.c - filter to ouput only 1 every n frame, or only the I (key)
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
3 * frame
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
4 *
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
5 * The parameters are:
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
6 *
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
7 * [I] | [i]num
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
8 *
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
9 * if you call the filter with I (uppercase) as the parameter
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
10 * ... -vf framestep=I ...
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
11 * then ONLY the keyframes are outputted.
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
12 * For DVD it means, generally, one every 15 frames (IBBPBBPBBPBBPBB), for avi it means
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
13 * every scene change or every keyint value (see -lavcopts).
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
14 *
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
15 * if you call the filter with the i (lowercase)
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
16 * ... -vf framestep=i ...
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
17 * then a I! followed by a cr is printed when a key frame (eg Intra frame) is
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
18 * found, leaving the current line of mplayer/mencoder, where you got the
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
19 * time, in seconds, and frame of the key. Use this information to split the
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
20 * AVI.
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
21 *
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
22 * After the i or alone you can put a positive number and only one frame every
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
23 * x (the number you set) is passed on the filter chain, limiting the output
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
24 * of the frame.
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
25 *
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
26 * Example
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
27 * ... -vf framestep=i20 ...
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
28 * Dump one every 20 frames, printing on the console when a I-Frame is encounter.
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
29 *
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
30 * ... -vf framestep=25
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
31 * Dump one every 25 frames.
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
32 *
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
33 * If you call the filter without parameter it does nothing (except using memory
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
34 * and resource of your system,. of course).
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
35 *
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
36 * This filter doesn' t work like the option -sstep seconds.
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
37 *
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
38 * The -sstep seek to the new position, without decoding all frames but,
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
39 * expecially on avi file coded whith mpeg4 (lavc or xvid or divx), the
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
40 * seek is not always too much precise.
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
41 *
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
42 * This filter simply discard the unwanted frames, so you are very precise in
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
43 * counting the frame but sometime you use a lot of CPU for nothing.
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
44 *
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
45 * As usual it depends on what you're doing.
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
46 *
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
47 * Daniele Forghieri ( guru@digitalfantasy.it )
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
48 */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
49
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
50 #include <stdio.h>
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
51 #include <stdlib.h>
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
52 #include <string.h>
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
53
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 10751
diff changeset
54 #include "config.h"
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 10751
diff changeset
55 #include "mp_msg.h"
18004
bcd805923554 Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents: 17906
diff changeset
56 #include "help_mp.h"
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 10751
diff changeset
57 #include "cpudetect.h"
10751
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
58
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
59 #include "img_format.h"
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
60 #include "mp_image.h"
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
61 #include "vf.h"
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
62
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 10751
diff changeset
63 #include "libvo/fastmemcpy.h"
10751
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
64
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
65 /* Uncomment if you want to print some info on the format */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
66 // #define DUMP_FORMAT_DATA
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
67
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
68 /* Private data */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
69 struct vf_priv_s {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
70 /* Current frame */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
71 int frame_cur;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
72 /* Frame output step, 0 = all */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
73 int frame_step;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
74 /* Only I-Frame (2), print on I-Frame (1) */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
75 int dump_iframe;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
76 };
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
77
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
78 /* Filter handler */
17906
20aca9baf5d8 passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents: 17012
diff changeset
79 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts)
10751
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
80 {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
81 mp_image_t *dmpi;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
82 struct vf_priv_s *priv;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
83 int skip;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
84
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
85 priv = vf->priv;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
86
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
87 /* Print the 'I' if is a intra frame. The \n advance the current line so you got the
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
88 * current file time (in second) and the frame number on the console ;-)
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
89 */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
90 if (priv->dump_iframe) {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
91 if (mpi->pict_type == 1) {
18004
bcd805923554 Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents: 17906
diff changeset
92 mp_msg(MSGT_VFILTER, MSGL_INFO, "I!\n");
10751
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
93 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
94 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
95
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
96 /* decide if frame must be shown */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
97 if (priv->dump_iframe == 2) {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
98 /* Only key frame */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
99 skip = mpi->pict_type == 1 ? 0 : 1;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
100 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
101 else {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
102 /* Only 1 every frame_step */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
103 skip = 0;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
104 if ((priv->frame_step != 0) && ((priv->frame_cur % priv->frame_step) != 0)) {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
105 skip = 1;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
106 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
107 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
108 /* Increment current frame */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
109 ++priv->frame_cur;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
110
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
111 if (skip == 0) {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
112 /* Get image, export type (we don't modify tghe image) */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
113 dmpi=vf_get_image(vf->next, mpi->imgfmt,
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
114 MP_IMGTYPE_EXPORT, 0,
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
115 mpi->w, mpi->h);
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
116 /* Copy only the pointer ( MP_IMGTYPE_EXPORT ! ) */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
117 dmpi->planes[0] = mpi->planes[0];
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
118 dmpi->planes[1] = mpi->planes[1];
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
119 dmpi->planes[2] = mpi->planes[2];
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
120
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
121 dmpi->stride[0] = mpi->stride[0];
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
122 dmpi->stride[1] = mpi->stride[1];
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
123 dmpi->stride[2] = mpi->stride[2];
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
124
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
125 dmpi->width = mpi->width;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
126 dmpi->height = mpi->height;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
127
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
128 /* Chain to next filter / output ... */
17906
20aca9baf5d8 passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents: 17012
diff changeset
129 return vf_next_put_image(vf, dmpi, pts);
10751
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
130 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
131
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
132 /* Skip the frame */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
133 return 0;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
134 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
135
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
136 static void uninit(struct vf_instance_s* vf)
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
137 {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
138 /* Free private data */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
139 free(vf->priv);
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
140 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
141
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
142 /* Main entry funct for the filter */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
143 static int open(vf_instance_t *vf, char* args)
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
144 {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
145 struct vf_priv_s *p;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
146
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
147 vf->put_image = put_image;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
148 vf->uninit = uninit;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
149 vf->default_reqs = VFCAP_ACCEPT_STRIDE;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
150 vf->priv = p = calloc(1, sizeof(struct vf_priv_s));
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
151 if (p == NULL) {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
152 return(0);
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
153 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
154
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
155 if (args != NULL) {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
156 #ifdef DUMP_FORMAT_DATA
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
157 if (*args == 'd') {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
158 p->dump_iframe = 3;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
159 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
160 else
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
161 #endif
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
162 if (*args == 'I') {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
163 /* Dump only KEY (ie INTRA) frame */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
164 p->dump_iframe = 2;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
165 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
166 else {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
167 if (*args == 'i') {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
168 /* Print a 'I!' when a i-frame is encounter */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
169 p->dump_iframe = 1;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
170 ++args;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
171 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
172
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
173 if (*args != '\0') {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
174 p->frame_step = atoi(args);
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
175 if (p->frame_step <= 0) {
18004
bcd805923554 Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents: 17906
diff changeset
176 mp_msg(MSGT_VFILTER, MSGL_WARN, MSGTR_MPCODECS_ErrorParsingArgument);
10751
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
177 return(0);
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
178 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
179 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
180 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
181 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
182 return 1;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
183 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
184
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
185 vf_info_t vf_info_framestep = {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
186 "Dump one every n / key frames",
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
187 "framestep",
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
188 "Daniele Forghieri",
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
189 "",
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
190 open,
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
191 NULL
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
192 };
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
193
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
194