annotate libmpcodecs/vf_screenshot.c @ 27450:4da9ce4d8327

Fix 'cast from pointer to integer of different size' on 64bit architectures. Casting to long should work for 32bit and 64bit and not make a difference to the boolean operation (since 'format' is always 32bit (int) the upper 32bit of 'arg' won't matter, but the compiler should be happy now. Casting both to unsigned makes sure the compiler isn't messing things up by sign-extending 'format' to 64bit before masking)
author ranma
date Sun, 24 Aug 2008 13:52:54 +0000
parents 1318e956c092
children 4681b6303443
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16874
diff changeset
1 #include "config.h"
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
2
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
3 #include <stdio.h>
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
4 #include <stdlib.h>
16464
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
5 #ifdef HAVE_MALLOC_H
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
6 #include <malloc.h>
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
7 #endif
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
8 #include <string.h>
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
9 #include <inttypes.h>
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
10
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
11 #include <sys/types.h>
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
12 #include <sys/stat.h>
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
13 #include <unistd.h>
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
14
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16874
diff changeset
15 #include "mp_msg.h"
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
16
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
17 #include "img_format.h"
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
18 #include "mp_image.h"
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
19 #include "vf.h"
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
20 #include "vf_scale.h"
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
21
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents: 18771
diff changeset
22 #include "libswscale/swscale.h"
24731
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
23 #include "libavcodec/avcodec.h"
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
24
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
25 struct vf_priv_s {
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
26 int frameno;
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
27 char fname[102];
19833
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
28 /// shot stores current screenshot mode:
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
29 /// 0: don't take screenshots
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
30 /// 1: take single screenshot, reset to 0 afterwards
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
31 /// 2: take screenshots of each frame
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
32 int shot, store_slices;
40222952440f DR and slice support
henry
parents: 16446
diff changeset
33 int dw, dh, stride;
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
34 uint8_t *buffer;
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
35 struct SwsContext *ctx;
24731
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
36 AVCodecContext *avctx;
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
37 uint8_t *outbuffer;
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
38 int outbuffer_size;
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
39 };
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
40
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
41 //===========================================================================//
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
42
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
43 static int config(struct vf_instance_s* vf,
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
44 int width, int height, int d_width, int d_height,
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
45 unsigned int flags, unsigned int outfmt)
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
46 {
16464
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
47 vf->priv->ctx=sws_getContextFromCmdLine(width, height, outfmt,
24731
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
48 d_width, d_height, IMGFMT_RGB24);
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
49
24731
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
50 vf->priv->outbuffer_size = d_width * d_height * 3 * 2;
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
51 vf->priv->outbuffer = realloc(vf->priv->outbuffer, vf->priv->outbuffer_size);
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
52 vf->priv->avctx->width = d_width;
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
53 vf->priv->avctx->height = d_height;
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
54 vf->priv->avctx->pix_fmt = PIX_FMT_RGB24;
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
55 vf->priv->avctx->compression_level = 0;
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
56 vf->priv->dw = d_width;
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
57 vf->priv->dh = d_height;
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
58 vf->priv->stride = (3*vf->priv->dw+15)&~15;
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
59
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
60 if (vf->priv->buffer) free(vf->priv->buffer); // probably reconfigured
16464
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
61 vf->priv->buffer = NULL;
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
62
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
63 return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt);
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
64 }
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
65
24731
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
66 static void write_png(struct vf_priv_s *priv)
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
67 {
24731
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
68 char *fname = priv->fname;
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
69 FILE * fp;
24731
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
70 AVFrame pic;
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
71 int size;
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
72
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
73 fp = fopen (fname, "wb");
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
74 if (fp == NULL) {
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
75 mp_msg(MSGT_VFILTER,MSGL_ERR,"\nPNG Error opening %s for writing!\n", fname);
18484
28fd6f89e1b8 Make return type consistent with usage. Patch by Pierre Lombard.
rathann
parents: 17906
diff changeset
76 return;
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
77 }
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
78
24731
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
79 pic.data[0] = priv->buffer;
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
80 pic.linesize[0] = priv->stride;
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
81 size = avcodec_encode_video(priv->avctx, priv->outbuffer, priv->outbuffer_size, &pic);
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
82 if (size > 0)
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
83 fwrite(priv->outbuffer, size, 1, fp);
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
84
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
85 fclose (fp);
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
86 }
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
87
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
88 static int fexists(char *fname)
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
89 {
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
90 struct stat dummy;
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
91 if (stat(fname, &dummy) == 0) return 1;
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
92 else return 0;
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
93 }
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
94
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
95 static void gen_fname(struct vf_priv_s* priv)
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
96 {
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
97 do {
40222952440f DR and slice support
henry
parents: 16446
diff changeset
98 snprintf (priv->fname, 100, "shot%04d.png", ++priv->frameno);
40222952440f DR and slice support
henry
parents: 16446
diff changeset
99 } while (fexists(priv->fname) && priv->frameno < 100000);
16457
5ab14fa7a019 do nothing if no free filenames are available
henry
parents: 16456
diff changeset
100 if (fexists(priv->fname)) {
5ab14fa7a019 do nothing if no free filenames are available
henry
parents: 16456
diff changeset
101 priv->fname[0] = '\0';
5ab14fa7a019 do nothing if no free filenames are available
henry
parents: 16456
diff changeset
102 return;
5ab14fa7a019 do nothing if no free filenames are available
henry
parents: 16456
diff changeset
103 }
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
104
40222952440f DR and slice support
henry
parents: 16446
diff changeset
105 mp_msg(MSGT_VFILTER,MSGL_INFO,"*** screenshot '%s' ***\n",priv->fname);
40222952440f DR and slice support
henry
parents: 16446
diff changeset
106
40222952440f DR and slice support
henry
parents: 16446
diff changeset
107 }
40222952440f DR and slice support
henry
parents: 16446
diff changeset
108
16464
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
109 static void scale_image(struct vf_priv_s* priv, mp_image_t *mpi)
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
110 {
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
111 uint8_t *dst[3];
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
112 int dst_stride[3];
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
113
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
114 dst_stride[0] = priv->stride;
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
115 dst_stride[1] = dst_stride[2] = 0;
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
116 if (!priv->buffer)
25800
f40e4a379384 Remove useless casts
reimar
parents: 25500
diff changeset
117 priv->buffer = memalign(16, dst_stride[0]*priv->dh);
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
118
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
119 dst[0] = priv->buffer;
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
120 dst[1] = dst[2] = 0;
20930
29c478a2483f Fix segfault with videos with unusual resolution, patch by Stanislav Maslovski % stanislav P maslovski A gmail P com %
gpoirier
parents: 19833
diff changeset
121 sws_scale_ordered(priv->ctx, mpi->planes, mpi->stride, 0, priv->dh, dst, dst_stride);
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
122 }
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
123
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
124 static void start_slice(struct vf_instance_s* vf, mp_image_t *mpi){
16464
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
125 vf->dmpi=vf_get_image(vf->next,mpi->imgfmt,
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
126 mpi->type, mpi->flags, mpi->width, mpi->height);
40222952440f DR and slice support
henry
parents: 16446
diff changeset
127 if (vf->priv->shot) {
40222952440f DR and slice support
henry
parents: 16446
diff changeset
128 vf->priv->store_slices = 1;
40222952440f DR and slice support
henry
parents: 16446
diff changeset
129 if (!vf->priv->buffer)
25800
f40e4a379384 Remove useless casts
reimar
parents: 25500
diff changeset
130 vf->priv->buffer = memalign(16, vf->priv->stride*vf->priv->dh);
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
131 }
40222952440f DR and slice support
henry
parents: 16446
diff changeset
132
40222952440f DR and slice support
henry
parents: 16446
diff changeset
133 }
40222952440f DR and slice support
henry
parents: 16446
diff changeset
134
40222952440f DR and slice support
henry
parents: 16446
diff changeset
135 static void draw_slice(struct vf_instance_s* vf,
40222952440f DR and slice support
henry
parents: 16446
diff changeset
136 unsigned char** src, int* stride, int w,int h, int x, int y){
40222952440f DR and slice support
henry
parents: 16446
diff changeset
137 if (vf->priv->store_slices) {
40222952440f DR and slice support
henry
parents: 16446
diff changeset
138 uint8_t *dst[3];
40222952440f DR and slice support
henry
parents: 16446
diff changeset
139 int dst_stride[3];
40222952440f DR and slice support
henry
parents: 16446
diff changeset
140 dst_stride[0] = vf->priv->stride;
40222952440f DR and slice support
henry
parents: 16446
diff changeset
141 dst_stride[1] = dst_stride[2] = 0;
40222952440f DR and slice support
henry
parents: 16446
diff changeset
142 dst[0] = vf->priv->buffer;
40222952440f DR and slice support
henry
parents: 16446
diff changeset
143 dst[1] = dst[2] = 0;
40222952440f DR and slice support
henry
parents: 16446
diff changeset
144 sws_scale_ordered(vf->priv->ctx, src, stride, y, h, dst, dst_stride);
40222952440f DR and slice support
henry
parents: 16446
diff changeset
145 }
40222952440f DR and slice support
henry
parents: 16446
diff changeset
146 vf_next_draw_slice(vf,src,stride,w,h,x,y);
40222952440f DR and slice support
henry
parents: 16446
diff changeset
147 }
40222952440f DR and slice support
henry
parents: 16446
diff changeset
148
40222952440f DR and slice support
henry
parents: 16446
diff changeset
149 static void get_image(struct vf_instance_s* vf, mp_image_t *mpi){
16464
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
150 // FIXME: should vf.c really call get_image when using slices??
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
151 if (mpi->flags & MP_IMGFLAG_DRAW_CALLBACK)
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
152 return;
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
153 vf->dmpi= vf_get_image(vf->next, mpi->imgfmt,
16464
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
154 mpi->type, mpi->flags/* | MP_IMGFLAG_READABLE*/, mpi->width, mpi->height);
16456
34eb986b7e4a use slices if DR isn't available
henry
parents: 16452
diff changeset
155
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
156 mpi->planes[0]=vf->dmpi->planes[0];
40222952440f DR and slice support
henry
parents: 16446
diff changeset
157 mpi->stride[0]=vf->dmpi->stride[0];
40222952440f DR and slice support
henry
parents: 16446
diff changeset
158 if(mpi->flags&MP_IMGFLAG_PLANAR){
40222952440f DR and slice support
henry
parents: 16446
diff changeset
159 mpi->planes[1]=vf->dmpi->planes[1];
40222952440f DR and slice support
henry
parents: 16446
diff changeset
160 mpi->planes[2]=vf->dmpi->planes[2];
40222952440f DR and slice support
henry
parents: 16446
diff changeset
161 mpi->stride[1]=vf->dmpi->stride[1];
40222952440f DR and slice support
henry
parents: 16446
diff changeset
162 mpi->stride[2]=vf->dmpi->stride[2];
40222952440f DR and slice support
henry
parents: 16446
diff changeset
163 }
40222952440f DR and slice support
henry
parents: 16446
diff changeset
164 mpi->width=vf->dmpi->width;
40222952440f DR and slice support
henry
parents: 16446
diff changeset
165
40222952440f DR and slice support
henry
parents: 16446
diff changeset
166 mpi->flags|=MP_IMGFLAG_DIRECT;
40222952440f DR and slice support
henry
parents: 16446
diff changeset
167
40222952440f DR and slice support
henry
parents: 16446
diff changeset
168 mpi->priv=(void*)vf->dmpi;
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
169 }
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
170
17906
20aca9baf5d8 passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents: 17012
diff changeset
171 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts)
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
172 {
16464
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
173 mp_image_t *dmpi = (mp_image_t *)mpi->priv;
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
174
16464
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
175 if (mpi->flags & MP_IMGFLAG_DRAW_CALLBACK)
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
176 dmpi = vf->dmpi;
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
177 else
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
178 if(!(mpi->flags&MP_IMGFLAG_DIRECT)){
16464
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
179 dmpi=vf_get_image(vf->next,mpi->imgfmt,
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
180 MP_IMGTYPE_EXPORT, 0,
40222952440f DR and slice support
henry
parents: 16446
diff changeset
181 mpi->width, mpi->height);
16464
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
182 vf_clone_mpi_attributes(dmpi, mpi);
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
183 dmpi->planes[0]=mpi->planes[0];
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
184 dmpi->planes[1]=mpi->planes[1];
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
185 dmpi->planes[2]=mpi->planes[2];
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
186 dmpi->stride[0]=mpi->stride[0];
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
187 dmpi->stride[1]=mpi->stride[1];
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
188 dmpi->stride[2]=mpi->stride[2];
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
189 dmpi->width=mpi->width;
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
190 dmpi->height=mpi->height;
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
191 }
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
192
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
193 if(vf->priv->shot) {
19833
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
194 if (vf->priv->shot==1)
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
195 vf->priv->shot=0;
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
196 gen_fname(vf->priv);
16457
5ab14fa7a019 do nothing if no free filenames are available
henry
parents: 16456
diff changeset
197 if (vf->priv->fname[0]) {
16464
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
198 if (!vf->priv->store_slices)
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
199 scale_image(vf->priv, dmpi);
24731
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
200 write_png(vf->priv);
16457
5ab14fa7a019 do nothing if no free filenames are available
henry
parents: 16456
diff changeset
201 }
16464
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
202 vf->priv->store_slices = 0;
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
203 }
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
204
17906
20aca9baf5d8 passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents: 17012
diff changeset
205 return vf_next_put_image(vf, dmpi, pts);
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
206 }
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
207
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
208 int control (vf_instance_t *vf, int request, void *data)
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
209 {
19833
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
210 /** data contains an integer argument
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
211 * 0: take screenshot with the next frame
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
212 * 1: take screenshots with each frame until the same command is given once again
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
213 **/
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
214 if(request==VFCTRL_SCREENSHOT) {
19833
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
215 if (data && *(int*)data) { // repeated screenshot mode
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
216 if (vf->priv->shot==2)
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
217 vf->priv->shot=0;
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
218 else
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
219 vf->priv->shot=2;
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
220 } else { // single screenshot
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
221 if (!vf->priv->shot)
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
222 vf->priv->shot=1;
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
223 }
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
224 return CONTROL_TRUE;
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
225 }
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
226 return vf_next_control (vf, request, data);
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
227 }
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
228
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
229
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
230 //===========================================================================//
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
231
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
232 static int query_format(struct vf_instance_s* vf, unsigned int fmt)
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
233 {
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
234 switch(fmt){
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
235 case IMGFMT_YV12:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
236 case IMGFMT_I420:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
237 case IMGFMT_IYUV:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
238 case IMGFMT_UYVY:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
239 case IMGFMT_YUY2:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
240 case IMGFMT_BGR32:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
241 case IMGFMT_BGR24:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
242 case IMGFMT_BGR16:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
243 case IMGFMT_BGR15:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
244 case IMGFMT_RGB32:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
245 case IMGFMT_RGB24:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
246 case IMGFMT_Y800:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
247 case IMGFMT_Y8:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
248 case IMGFMT_YVU9:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
249 case IMGFMT_IF09:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
250 case IMGFMT_444P:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
251 case IMGFMT_422P:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
252 case IMGFMT_411P:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
253 return vf_next_query_format(vf, fmt);
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
254 }
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
255 return 0;
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
256 }
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
257
16874
debd99a161e0 10l, uninit() was not used, fixes bug #401
reimar
parents: 16464
diff changeset
258 static void uninit(vf_instance_t *vf);
16464
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
259 // open conflicts with stdio.h at least under MinGW
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
260 static int screenshot_open(vf_instance_t *vf, char* args)
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
261 {
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
262 vf->config=config;
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
263 vf->control=control;
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
264 vf->put_image=put_image;
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
265 vf->query_format=query_format;
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
266 vf->start_slice=start_slice;
40222952440f DR and slice support
henry
parents: 16446
diff changeset
267 vf->draw_slice=draw_slice;
40222952440f DR and slice support
henry
parents: 16446
diff changeset
268 vf->get_image=get_image;
16874
debd99a161e0 10l, uninit() was not used, fixes bug #401
reimar
parents: 16464
diff changeset
269 vf->uninit=uninit;
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
270 vf->priv=malloc(sizeof(struct vf_priv_s));
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
271 vf->priv->frameno=0;
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
272 vf->priv->shot=0;
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
273 vf->priv->store_slices=0;
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
274 vf->priv->buffer=0;
24731
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
275 vf->priv->outbuffer=0;
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
276 vf->priv->ctx=0;
24731
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
277 vf->priv->avctx = avcodec_alloc_context();
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
278 avcodec_register_all();
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
279 if (avcodec_open(vf->priv->avctx, avcodec_find_encoder(CODEC_ID_PNG))) {
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
280 mp_msg(MSGT_VFILTER, MSGL_FATAL, "Could not open libavcodec PNG encoder\n");
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
281 return 0;
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
282 }
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
283 return 1;
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
284 }
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
285
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
286 static void uninit(vf_instance_t *vf)
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
287 {
25500
1e8364740a86 Add a missing free of the avctx
reimar
parents: 25221
diff changeset
288 av_freep(&vf->priv->avctx);
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
289 if(vf->priv->ctx) sws_freeContext(vf->priv->ctx);
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
290 if (vf->priv->buffer) free(vf->priv->buffer);
24731
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
291 free(vf->priv->outbuffer);
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
292 free(vf->priv);
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
293 }
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
294
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
295
25221
00fff9a3b735 Make all vf_info_t structs const
reimar
parents: 24731
diff changeset
296 const vf_info_t vf_info_screenshot = {
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
297 "screenshot to file",
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
298 "screenshot",
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
299 "A'rpi, Jindrich Makovicka",
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
300 "",
16464
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
301 screenshot_open,
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
302 NULL
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
303 };
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
304
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
305 //===========================================================================//