annotate libmpcodecs/vf_framestep.c @ 24576:6704a924d4aa

According to MSDN a thread must call CoUninitialize once for each successful call it has made to CoInitialize or CoInitializeEx, including any call that returns S_FALSE. Only the CoUninitialize call corresponding to the CoInitialize or CoInitializeEx call that initialized the library can close it. patch by Gianluigi Tiesi, mplayer netfarm it
author diego
date Sun, 23 Sep 2007 20:37:33 +0000
parents f8d4f8eff72b
children 00fff9a3b735
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
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
63 /* Uncomment if you want to print some info on the format */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
64 // #define DUMP_FORMAT_DATA
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
65
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
66 /* Private data */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
67 struct vf_priv_s {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
68 /* Current frame */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
69 int frame_cur;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
70 /* Frame output step, 0 = all */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
71 int frame_step;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
72 /* Only I-Frame (2), print on I-Frame (1) */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
73 int dump_iframe;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
74 };
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
75
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
76 /* 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
77 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
78 {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
79 mp_image_t *dmpi;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
80 struct vf_priv_s *priv;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
81 int skip;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
82
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
83 priv = vf->priv;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
84
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
85 /* 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
86 * current file time (in second) and the frame number on the console ;-)
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
87 */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
88 if (priv->dump_iframe) {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
89 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
90 mp_msg(MSGT_VFILTER, MSGL_INFO, "I!\n");
10751
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
91 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
92 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
93
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
94 /* decide if frame must be shown */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
95 if (priv->dump_iframe == 2) {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
96 /* Only key frame */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
97 skip = mpi->pict_type == 1 ? 0 : 1;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
98 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
99 else {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
100 /* Only 1 every frame_step */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
101 skip = 0;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
102 if ((priv->frame_step != 0) && ((priv->frame_cur % priv->frame_step) != 0)) {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
103 skip = 1;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
104 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
105 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
106 /* Increment current frame */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
107 ++priv->frame_cur;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
108
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
109 if (skip == 0) {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
110 /* Get image, export type (we don't modify tghe image) */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
111 dmpi=vf_get_image(vf->next, mpi->imgfmt,
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
112 MP_IMGTYPE_EXPORT, 0,
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
113 mpi->w, mpi->h);
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
114 /* Copy only the pointer ( MP_IMGTYPE_EXPORT ! ) */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
115 dmpi->planes[0] = mpi->planes[0];
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
116 dmpi->planes[1] = mpi->planes[1];
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
117 dmpi->planes[2] = mpi->planes[2];
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
118
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
119 dmpi->stride[0] = mpi->stride[0];
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
120 dmpi->stride[1] = mpi->stride[1];
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
121 dmpi->stride[2] = mpi->stride[2];
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
122
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
123 dmpi->width = mpi->width;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
124 dmpi->height = mpi->height;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
125
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
126 /* 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
127 return vf_next_put_image(vf, dmpi, pts);
10751
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
128 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
129
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
130 /* Skip the frame */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
131 return 0;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
132 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
133
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
134 static void uninit(struct vf_instance_s* vf)
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
135 {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
136 /* Free private data */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
137 free(vf->priv);
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
138 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
139
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
140 /* Main entry funct for the filter */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
141 static int open(vf_instance_t *vf, char* args)
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
142 {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
143 struct vf_priv_s *p;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
144
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
145 vf->put_image = put_image;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
146 vf->uninit = uninit;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
147 vf->default_reqs = VFCAP_ACCEPT_STRIDE;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
148 vf->priv = p = calloc(1, sizeof(struct vf_priv_s));
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
149 if (p == NULL) {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
150 return(0);
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
151 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
152
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
153 if (args != NULL) {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
154 #ifdef DUMP_FORMAT_DATA
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
155 if (*args == 'd') {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
156 p->dump_iframe = 3;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
157 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
158 else
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
159 #endif
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
160 if (*args == 'I') {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
161 /* Dump only KEY (ie INTRA) frame */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
162 p->dump_iframe = 2;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
163 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
164 else {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
165 if (*args == 'i') {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
166 /* Print a 'I!' when a i-frame is encounter */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
167 p->dump_iframe = 1;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
168 ++args;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
169 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
170
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
171 if (*args != '\0') {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
172 p->frame_step = atoi(args);
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
173 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
174 mp_msg(MSGT_VFILTER, MSGL_WARN, MSGTR_MPCODECS_ErrorParsingArgument);
10751
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
175 return(0);
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
176 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
177 }
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 return 1;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
181 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
182
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
183 vf_info_t vf_info_framestep = {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
184 "Dump one every n / key frames",
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
185 "framestep",
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
186 "Daniele Forghieri",
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
187 "",
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
188 open,
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
189 NULL
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
190 };
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
191
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
192