annotate libmpcodecs/vf_screenshot.c @ 25194:e816d546c4fe

ao_null: Make duration of "buffered" audio constant Choose the "buffer size" for the amount of audio the driver accepts so that it corresponds to about 0.2 seconds of playback based on the number of channels, sample size and samplerate.
author uau
date Sat, 01 Dec 2007 01:39:39 +0000
parents 1d9ea74f79a0
children 00fff9a3b735
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"
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
23
24731
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
24 #ifdef USE_LIBAVCODEC_SO
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
25 #include <ffmpeg/avcodec.h>
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
26 #else
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
27 #include "libavcodec/avcodec.h"
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
28 #endif
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
29
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
30 struct vf_priv_s {
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
31 int frameno;
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
32 char fname[102];
19833
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
33 /// shot stores current screenshot mode:
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
34 /// 0: don't take screenshots
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
35 /// 1: take single screenshot, reset to 0 afterwards
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
36 /// 2: take screenshots of each frame
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
37 int shot, store_slices;
40222952440f DR and slice support
henry
parents: 16446
diff changeset
38 int dw, dh, stride;
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
39 uint8_t *buffer;
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
40 struct SwsContext *ctx;
24731
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
41 AVCodecContext *avctx;
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
42 uint8_t *outbuffer;
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
43 int outbuffer_size;
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
44 };
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
45
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
46 //===========================================================================//
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
47
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
48 static int config(struct vf_instance_s* vf,
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
49 int width, int height, int d_width, int d_height,
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
50 unsigned int flags, unsigned int outfmt)
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
51 {
16464
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
52 vf->priv->ctx=sws_getContextFromCmdLine(width, height, outfmt,
24731
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
53 d_width, d_height, IMGFMT_RGB24);
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
54
24731
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
55 vf->priv->outbuffer_size = d_width * d_height * 3 * 2;
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
56 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
57 vf->priv->avctx->width = d_width;
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
58 vf->priv->avctx->height = d_height;
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
59 vf->priv->avctx->pix_fmt = PIX_FMT_RGB24;
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
60 vf->priv->avctx->compression_level = 0;
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
61 vf->priv->dw = d_width;
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
62 vf->priv->dh = d_height;
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
63 vf->priv->stride = (3*vf->priv->dw+15)&~15;
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
64
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
65 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
66 vf->priv->buffer = NULL;
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
67
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
68 return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt);
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
69 }
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
70
24731
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
71 static void write_png(struct vf_priv_s *priv)
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
72 {
24731
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
73 char *fname = priv->fname;
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
74 FILE * fp;
24731
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
75 AVFrame pic;
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
76 int size;
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
77
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
78 fp = fopen (fname, "wb");
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
79 if (fp == NULL) {
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
80 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
81 return;
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
82 }
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
83
24731
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
84 pic.data[0] = priv->buffer;
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
85 pic.linesize[0] = priv->stride;
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
86 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
87 if (size > 0)
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
88 fwrite(priv->outbuffer, size, 1, fp);
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
89
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
90 fclose (fp);
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
91 }
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
92
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
93 static int fexists(char *fname)
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
94 {
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
95 struct stat dummy;
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
96 if (stat(fname, &dummy) == 0) return 1;
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
97 else return 0;
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
98 }
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
99
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
100 static void gen_fname(struct vf_priv_s* priv)
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
101 {
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
102 do {
40222952440f DR and slice support
henry
parents: 16446
diff changeset
103 snprintf (priv->fname, 100, "shot%04d.png", ++priv->frameno);
40222952440f DR and slice support
henry
parents: 16446
diff changeset
104 } while (fexists(priv->fname) && priv->frameno < 100000);
16457
5ab14fa7a019 do nothing if no free filenames are available
henry
parents: 16456
diff changeset
105 if (fexists(priv->fname)) {
5ab14fa7a019 do nothing if no free filenames are available
henry
parents: 16456
diff changeset
106 priv->fname[0] = '\0';
5ab14fa7a019 do nothing if no free filenames are available
henry
parents: 16456
diff changeset
107 return;
5ab14fa7a019 do nothing if no free filenames are available
henry
parents: 16456
diff changeset
108 }
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
109
40222952440f DR and slice support
henry
parents: 16446
diff changeset
110 mp_msg(MSGT_VFILTER,MSGL_INFO,"*** screenshot '%s' ***\n",priv->fname);
40222952440f DR and slice support
henry
parents: 16446
diff changeset
111
40222952440f DR and slice support
henry
parents: 16446
diff changeset
112 }
40222952440f DR and slice support
henry
parents: 16446
diff changeset
113
16464
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
114 static void scale_image(struct vf_priv_s* priv, mp_image_t *mpi)
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
115 {
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
116 uint8_t *dst[3];
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
117 int dst_stride[3];
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
118
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
119 dst_stride[0] = priv->stride;
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
120 dst_stride[1] = dst_stride[2] = 0;
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
121 if (!priv->buffer)
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
122 priv->buffer = (uint8_t*)memalign(16, dst_stride[0]*priv->dh);
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
123
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
124 dst[0] = priv->buffer;
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
125 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
126 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
127 }
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
128
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
129 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
130 vf->dmpi=vf_get_image(vf->next,mpi->imgfmt,
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
131 mpi->type, mpi->flags, mpi->width, mpi->height);
40222952440f DR and slice support
henry
parents: 16446
diff changeset
132 if (vf->priv->shot) {
40222952440f DR and slice support
henry
parents: 16446
diff changeset
133 vf->priv->store_slices = 1;
40222952440f DR and slice support
henry
parents: 16446
diff changeset
134 if (!vf->priv->buffer)
40222952440f DR and slice support
henry
parents: 16446
diff changeset
135 vf->priv->buffer = (uint8_t*)memalign(16, vf->priv->stride*vf->priv->dh);
40222952440f DR and slice support
henry
parents: 16446
diff changeset
136 }
40222952440f DR and slice support
henry
parents: 16446
diff changeset
137
40222952440f DR and slice support
henry
parents: 16446
diff changeset
138 }
40222952440f DR and slice support
henry
parents: 16446
diff changeset
139
40222952440f DR and slice support
henry
parents: 16446
diff changeset
140 static void draw_slice(struct vf_instance_s* vf,
40222952440f DR and slice support
henry
parents: 16446
diff changeset
141 unsigned char** src, int* stride, int w,int h, int x, int y){
40222952440f DR and slice support
henry
parents: 16446
diff changeset
142 if (vf->priv->store_slices) {
40222952440f DR and slice support
henry
parents: 16446
diff changeset
143 uint8_t *dst[3];
40222952440f DR and slice support
henry
parents: 16446
diff changeset
144 int dst_stride[3];
40222952440f DR and slice support
henry
parents: 16446
diff changeset
145 dst_stride[0] = vf->priv->stride;
40222952440f DR and slice support
henry
parents: 16446
diff changeset
146 dst_stride[1] = dst_stride[2] = 0;
40222952440f DR and slice support
henry
parents: 16446
diff changeset
147 dst[0] = vf->priv->buffer;
40222952440f DR and slice support
henry
parents: 16446
diff changeset
148 dst[1] = dst[2] = 0;
40222952440f DR and slice support
henry
parents: 16446
diff changeset
149 sws_scale_ordered(vf->priv->ctx, src, stride, y, h, dst, dst_stride);
40222952440f DR and slice support
henry
parents: 16446
diff changeset
150 }
40222952440f DR and slice support
henry
parents: 16446
diff changeset
151 vf_next_draw_slice(vf,src,stride,w,h,x,y);
40222952440f DR and slice support
henry
parents: 16446
diff changeset
152 }
40222952440f DR and slice support
henry
parents: 16446
diff changeset
153
40222952440f DR and slice support
henry
parents: 16446
diff changeset
154 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
155 // 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
156 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
157 return;
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
158 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
159 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
160
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
161 mpi->planes[0]=vf->dmpi->planes[0];
40222952440f DR and slice support
henry
parents: 16446
diff changeset
162 mpi->stride[0]=vf->dmpi->stride[0];
40222952440f DR and slice support
henry
parents: 16446
diff changeset
163 if(mpi->flags&MP_IMGFLAG_PLANAR){
40222952440f DR and slice support
henry
parents: 16446
diff changeset
164 mpi->planes[1]=vf->dmpi->planes[1];
40222952440f DR and slice support
henry
parents: 16446
diff changeset
165 mpi->planes[2]=vf->dmpi->planes[2];
40222952440f DR and slice support
henry
parents: 16446
diff changeset
166 mpi->stride[1]=vf->dmpi->stride[1];
40222952440f DR and slice support
henry
parents: 16446
diff changeset
167 mpi->stride[2]=vf->dmpi->stride[2];
40222952440f DR and slice support
henry
parents: 16446
diff changeset
168 }
40222952440f DR and slice support
henry
parents: 16446
diff changeset
169 mpi->width=vf->dmpi->width;
40222952440f DR and slice support
henry
parents: 16446
diff changeset
170
40222952440f DR and slice support
henry
parents: 16446
diff changeset
171 mpi->flags|=MP_IMGFLAG_DIRECT;
40222952440f DR and slice support
henry
parents: 16446
diff changeset
172
40222952440f DR and slice support
henry
parents: 16446
diff changeset
173 mpi->priv=(void*)vf->dmpi;
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
174 }
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
175
17906
20aca9baf5d8 passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents: 17012
diff changeset
176 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts)
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
177 {
16464
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
178 mp_image_t *dmpi = (mp_image_t *)mpi->priv;
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
179
16464
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
180 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
181 dmpi = vf->dmpi;
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
182 else
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
183 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
184 dmpi=vf_get_image(vf->next,mpi->imgfmt,
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
185 MP_IMGTYPE_EXPORT, 0,
40222952440f DR and slice support
henry
parents: 16446
diff changeset
186 mpi->width, mpi->height);
16464
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
187 vf_clone_mpi_attributes(dmpi, mpi);
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
188 dmpi->planes[0]=mpi->planes[0];
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
189 dmpi->planes[1]=mpi->planes[1];
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
190 dmpi->planes[2]=mpi->planes[2];
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
191 dmpi->stride[0]=mpi->stride[0];
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
192 dmpi->stride[1]=mpi->stride[1];
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
193 dmpi->stride[2]=mpi->stride[2];
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
194 dmpi->width=mpi->width;
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
195 dmpi->height=mpi->height;
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
196 }
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
197
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
198 if(vf->priv->shot) {
19833
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
199 if (vf->priv->shot==1)
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
200 vf->priv->shot=0;
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
201 gen_fname(vf->priv);
16457
5ab14fa7a019 do nothing if no free filenames are available
henry
parents: 16456
diff changeset
202 if (vf->priv->fname[0]) {
16464
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
203 if (!vf->priv->store_slices)
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
204 scale_image(vf->priv, dmpi);
24731
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
205 write_png(vf->priv);
16457
5ab14fa7a019 do nothing if no free filenames are available
henry
parents: 16456
diff changeset
206 }
16464
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
207 vf->priv->store_slices = 0;
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
208 }
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
209
17906
20aca9baf5d8 passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents: 17012
diff changeset
210 return vf_next_put_image(vf, dmpi, pts);
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
211 }
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
212
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
213 int control (vf_instance_t *vf, int request, void *data)
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
214 {
19833
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
215 /** data contains an integer argument
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
216 * 0: take screenshot with the next frame
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
217 * 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
218 **/
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
219 if(request==VFCTRL_SCREENSHOT) {
19833
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
220 if (data && *(int*)data) { // repeated screenshot mode
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
221 if (vf->priv->shot==2)
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
222 vf->priv->shot=0;
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
223 else
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
224 vf->priv->shot=2;
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
225 } else { // single screenshot
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
226 if (!vf->priv->shot)
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
227 vf->priv->shot=1;
10f36060390a Add repeated screenshot mode to vf_screenshot.
eugeni
parents: 18879
diff changeset
228 }
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
229 return CONTROL_TRUE;
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
230 }
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
231 return vf_next_control (vf, request, data);
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
232 }
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
233
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
234
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
235 //===========================================================================//
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
236
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
237 static int query_format(struct vf_instance_s* vf, unsigned int fmt)
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
238 {
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
239 switch(fmt){
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
240 case IMGFMT_YV12:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
241 case IMGFMT_I420:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
242 case IMGFMT_IYUV:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
243 case IMGFMT_UYVY:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
244 case IMGFMT_YUY2:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
245 case IMGFMT_BGR32:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
246 case IMGFMT_BGR24:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
247 case IMGFMT_BGR16:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
248 case IMGFMT_BGR15:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
249 case IMGFMT_RGB32:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
250 case IMGFMT_RGB24:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
251 case IMGFMT_Y800:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
252 case IMGFMT_Y8:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
253 case IMGFMT_YVU9:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
254 case IMGFMT_IF09:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
255 case IMGFMT_444P:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
256 case IMGFMT_422P:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
257 case IMGFMT_411P:
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
258 return vf_next_query_format(vf, fmt);
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
259 }
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
260 return 0;
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
261 }
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
262
16874
debd99a161e0 10l, uninit() was not used, fixes bug #401
reimar
parents: 16464
diff changeset
263 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
264 // 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
265 static int screenshot_open(vf_instance_t *vf, char* args)
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
266 {
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
267 vf->config=config;
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
268 vf->control=control;
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
269 vf->put_image=put_image;
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
270 vf->query_format=query_format;
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
271 vf->start_slice=start_slice;
40222952440f DR and slice support
henry
parents: 16446
diff changeset
272 vf->draw_slice=draw_slice;
40222952440f DR and slice support
henry
parents: 16446
diff changeset
273 vf->get_image=get_image;
16874
debd99a161e0 10l, uninit() was not used, fixes bug #401
reimar
parents: 16464
diff changeset
274 vf->uninit=uninit;
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
275 vf->priv=malloc(sizeof(struct vf_priv_s));
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
276 vf->priv->frameno=0;
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
277 vf->priv->shot=0;
16450
40222952440f DR and slice support
henry
parents: 16446
diff changeset
278 vf->priv->store_slices=0;
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
279 vf->priv->buffer=0;
24731
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
280 vf->priv->outbuffer=0;
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
281 vf->priv->ctx=0;
24731
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
282 vf->priv->avctx = avcodec_alloc_context();
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
283 avcodec_register_all();
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
284 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
285 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
286 return 0;
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
287 }
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
288 return 1;
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
289 }
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
290
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
291 static void uninit(vf_instance_t *vf)
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
292 {
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
293 if(vf->priv->ctx) sws_freeContext(vf->priv->ctx);
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
294 if (vf->priv->buffer) free(vf->priv->buffer);
24731
1d9ea74f79a0 Make vf_screenshot use the libavcodec PNG encoder
reimar
parents: 23373
diff changeset
295 free(vf->priv->outbuffer);
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
296 free(vf->priv);
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
297 }
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
298
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
299
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
300 vf_info_t vf_info_screenshot = {
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
301 "screenshot to file",
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
302 "screenshot",
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
303 "A'rpi, Jindrich Makovicka",
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
304 "",
16464
0a828abf1f0f Fix multiple issues: No picture at all, broken pictures, only every second
reimar
parents: 16457
diff changeset
305 screenshot_open,
16446
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
306 NULL
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
307 };
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
308
c82c0d407ec9 screenshot filter
henry
parents:
diff changeset
309 //===========================================================================//