annotate libvo/vo_yuv4mpeg.c @ 28041:211c23dac000

Treat audio output objects the same as everything else in the build system, i.e. have lines that conditionally enable each in the Makefile and corresponding variables set from configure.
author diego
date Wed, 03 Dec 2008 12:05:47 +0000
parents c9e9ac2008c2
children 7681eab10aea
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
1 /*
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
2 * vo_yuv4mpeg.c, yuv4mpeg (mjpegtools) interface
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
3 *
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
4 * Thrown together by
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
5 * Robert Kesterson <robertk@robertk.com>
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
6 * Based on the pgm output plugin, the rgb2rgb postproc filter, divxdec,
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
7 * and probably others.
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
8 *
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
9 * This is undoubtedly incomplete, inaccurate, or just plain wrong. :-)
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
10 *
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
11 * 2002/06/19 Klaus Stengel <Klaus.Stengel@asamnet.de>
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
12 * - added support for interlaced output
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
13 * Activate by using '-vo yuv4mpeg:interlaced'
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
14 * or '-vo yuv4mpeg:interlaced_bf' if your source has
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
15 * bottom fields first
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
16 * - added some additional checks to catch problems
5832
041bd56e41dc added support for output of subtitles - Juergen Hammelmann <juergen.hammelmann@gmx.de>
arpi
parents: 4737
diff changeset
17 *
041bd56e41dc added support for output of subtitles - Juergen Hammelmann <juergen.hammelmann@gmx.de>
arpi
parents: 4737
diff changeset
18 * 2002/04/17 Juergen Hammelmann <juergen.hammelmann@gmx.de>
041bd56e41dc added support for output of subtitles - Juergen Hammelmann <juergen.hammelmann@gmx.de>
arpi
parents: 4737
diff changeset
19 * - added support for output of subtitles
041bd56e41dc added support for output of subtitles - Juergen Hammelmann <juergen.hammelmann@gmx.de>
arpi
parents: 4737
diff changeset
20 * best, if you give option '-osdlevel 0' to mplayer for
041bd56e41dc added support for output of subtitles - Juergen Hammelmann <juergen.hammelmann@gmx.de>
arpi
parents: 4737
diff changeset
21 * no watching the seek+timer
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
22 */
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
23
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
24 #include <stdio.h>
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
25 #include <stdlib.h>
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
26 #include <string.h>
4640
ea3bd3328fc6 removed unused includes, added fastmemcpy support, removed local copy of rgb24toyv12 (using one in postproc/rgb2rgb.c)
alex
parents: 4633
diff changeset
27 #include <unistd.h>
4737
32e1f5042f65 I don't like such reports: '-vo dga:vidix or -vo x11:vidix works fine for me'
nick
parents: 4706
diff changeset
28 #include <errno.h>
4640
ea3bd3328fc6 removed unused includes, added fastmemcpy support, removed local copy of rgb24toyv12 (using one in postproc/rgb2rgb.c)
alex
parents: 4633
diff changeset
29 #include <fcntl.h>
21805
924da043b8ce Use av_d2q to produce the fps fraction, this usually produces more sane fractions
reimar
parents: 21804
diff changeset
30 #include <limits.h>
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
31
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
32 #include "config.h"
14284
08399423fe30 Use subopt parser
reimar
parents: 14145
diff changeset
33 #include "subopt-helper.h"
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
34 #include "video_out.h"
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
35 #include "video_out_internal.h"
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
36
13462
01cc6b0a6e72 printf --> mp_msg transition in vo_yuv4mpeg
diego
parents: 10802
diff changeset
37 #include "mp_msg.h"
01cc6b0a6e72 printf --> mp_msg transition in vo_yuv4mpeg
diego
parents: 10802
diff changeset
38 #include "help_mp.h"
01cc6b0a6e72 printf --> mp_msg transition in vo_yuv4mpeg
diego
parents: 10802
diff changeset
39
5832
041bd56e41dc added support for output of subtitles - Juergen Hammelmann <juergen.hammelmann@gmx.de>
arpi
parents: 4737
diff changeset
40 #include "sub.h"
041bd56e41dc added support for output of subtitles - Juergen Hammelmann <juergen.hammelmann@gmx.de>
arpi
parents: 4737
diff changeset
41
4640
ea3bd3328fc6 removed unused includes, added fastmemcpy support, removed local copy of rgb24toyv12 (using one in postproc/rgb2rgb.c)
alex
parents: 4633
diff changeset
42 #include "fastmemcpy.h"
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents: 16171
diff changeset
43 #include "libswscale/swscale.h"
20428
19059fe62daa fix linking issue on PPC64 with 64bits userland, patch by Markus Rothe markus A unixforces P net
gpoirier
parents: 20398
diff changeset
44 #include "libswscale/rgb2rgb.h"
13787
e047e70a9767 Handle "xxx.h" vs "../xxx.h" include paths in a consistent way.
diego
parents: 13462
diff changeset
45 #include "libmpcodecs/vf_scale.h"
20398
69cb57c406a8 Set aspect information in yuv4mpeg
reimar
parents: 18861
diff changeset
46 #include "libavutil/rational.h"
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
47
25216
3aee342be929 Make vo info structs const
reimar
parents: 23457
diff changeset
48 static const vo_info_t info =
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
49 {
14095
367ba4601d47 Add a file= suboption to set output file.
reimar
parents: 13787
diff changeset
50 "yuv4mpeg output for mjpegtools",
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
51 "yuv4mpeg",
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
52 "Robert Kesterson <robertk@robertk.com>",
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
53 ""
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
54 };
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
55
25220
c9e9ac2008c2 Mark the vo_functions_t definitions as const where possible.
reimar
parents: 25216
diff changeset
56 const LIBVO_EXTERN (yuv4mpeg)
8148
5b39e79af5fe removed get_info, using the same sheme as in libmpcodecs instead
alex
parents: 7688
diff changeset
57
14145
9c47f90ad94a fix leak with -fixed-vo, allow concatenating
reimar
parents: 14095
diff changeset
58 static int image_width = 0;
9c47f90ad94a fix leak with -fixed-vo, allow concatenating
reimar
parents: 14095
diff changeset
59 static int image_height = 0;
9c47f90ad94a fix leak with -fixed-vo, allow concatenating
reimar
parents: 14095
diff changeset
60 static float image_fps = 0;
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
61
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
62 static uint8_t *image = NULL;
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
63 static uint8_t *image_y = NULL;
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
64 static uint8_t *image_u = NULL;
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
65 static uint8_t *image_v = NULL;
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
66
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
67 static uint8_t *rgb_buffer = NULL;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
68 static uint8_t *rgb_line_buffer = NULL;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
69
14095
367ba4601d47 Add a file= suboption to set output file.
reimar
parents: 13787
diff changeset
70 static char *yuv_filename = NULL;
367ba4601d47 Add a file= suboption to set output file.
reimar
parents: 13787
diff changeset
71
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
72 static int using_format = 0;
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
73 static FILE *yuv_out;
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
74 static int write_bytes;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
75
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
76 #define Y4M_ILACE_NONE 'p' /* non-interlaced, progressive frame */
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
77 #define Y4M_ILACE_TOP_FIRST 't' /* interlaced, top-field first */
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
78 #define Y4M_ILACE_BOTTOM_FIRST 'b' /* interlaced, bottom-field first */
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
79
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
80 /* Set progressive mode as default */
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
81 static int config_interlace = Y4M_ILACE_NONE;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
82 #define Y4M_IS_INTERLACED (config_interlace != Y4M_ILACE_NONE)
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
83
16171
fd51fd1ff231 Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents: 15212
diff changeset
84 static int config(uint32_t width, uint32_t height, uint32_t d_width,
15212
05aa13cdf92f replace VO and VF numeric flags with #defined identifiers
henry
parents: 14538
diff changeset
85 uint32_t d_height, uint32_t flags, char *title,
7124
eca7dbad0166 finally removed query_vaa, bes_da and vo_tune_info - the obsoleted libvo api
alex
parents: 6659
diff changeset
86 uint32_t format)
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
87 {
20398
69cb57c406a8 Set aspect information in yuv4mpeg
reimar
parents: 18861
diff changeset
88 AVRational pixelaspect = av_div_q((AVRational){d_width, d_height},
69cb57c406a8 Set aspect information in yuv4mpeg
reimar
parents: 18861
diff changeset
89 (AVRational){width, height});
21805
924da043b8ce Use av_d2q to produce the fps fraction, this usually produces more sane fractions
reimar
parents: 21804
diff changeset
90 AVRational fps_frac = av_d2q(vo_fps, INT_MAX);
14145
9c47f90ad94a fix leak with -fixed-vo, allow concatenating
reimar
parents: 14095
diff changeset
91 if (image_width == width && image_height == height &&
9c47f90ad94a fix leak with -fixed-vo, allow concatenating
reimar
parents: 14095
diff changeset
92 image_fps == vo_fps && vo_config_count)
9c47f90ad94a fix leak with -fixed-vo, allow concatenating
reimar
parents: 14095
diff changeset
93 return 0;
9c47f90ad94a fix leak with -fixed-vo, allow concatenating
reimar
parents: 14095
diff changeset
94 if (vo_config_count) {
9c47f90ad94a fix leak with -fixed-vo, allow concatenating
reimar
parents: 14095
diff changeset
95 mp_msg(MSGT_VO, MSGL_WARN,
9c47f90ad94a fix leak with -fixed-vo, allow concatenating
reimar
parents: 14095
diff changeset
96 "Video formats differ (w:%i=>%i, h:%i=>%i, fps:%f=>%f), "
9c47f90ad94a fix leak with -fixed-vo, allow concatenating
reimar
parents: 14095
diff changeset
97 "restarting output.\n",
9c47f90ad94a fix leak with -fixed-vo, allow concatenating
reimar
parents: 14095
diff changeset
98 image_width, width, image_height, height, image_fps, vo_fps);
9c47f90ad94a fix leak with -fixed-vo, allow concatenating
reimar
parents: 14095
diff changeset
99 uninit();
9c47f90ad94a fix leak with -fixed-vo, allow concatenating
reimar
parents: 14095
diff changeset
100 }
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
101 image_height = height;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
102 image_width = width;
14145
9c47f90ad94a fix leak with -fixed-vo, allow concatenating
reimar
parents: 14095
diff changeset
103 image_fps = vo_fps;
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
104 using_format = format;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
105
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
106 if (Y4M_IS_INTERLACED)
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
107 {
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
108 if (height % 4)
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
109 {
13462
01cc6b0a6e72 printf --> mp_msg transition in vo_yuv4mpeg
diego
parents: 10802
diff changeset
110 mp_msg(MSGT_VO,MSGL_FATAL,
01cc6b0a6e72 printf --> mp_msg transition in vo_yuv4mpeg
diego
parents: 10802
diff changeset
111 MSGTR_VO_YUV4MPEG_InterlacedHeightDivisibleBy4);
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
112 return -1;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
113 }
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
114
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
115 rgb_line_buffer = malloc(image_width * 3);
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
116 if (!rgb_line_buffer)
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
117 {
13462
01cc6b0a6e72 printf --> mp_msg transition in vo_yuv4mpeg
diego
parents: 10802
diff changeset
118 mp_msg(MSGT_VO,MSGL_FATAL,
01cc6b0a6e72 printf --> mp_msg transition in vo_yuv4mpeg
diego
parents: 10802
diff changeset
119 MSGTR_VO_YUV4MPEG_InterlacedLineBufAllocFail);
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
120 return -1;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
121 }
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
122
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
123 if (using_format == IMGFMT_YV12)
13462
01cc6b0a6e72 printf --> mp_msg transition in vo_yuv4mpeg
diego
parents: 10802
diff changeset
124 mp_msg(MSGT_VO,MSGL_WARN,
01cc6b0a6e72 printf --> mp_msg transition in vo_yuv4mpeg
diego
parents: 10802
diff changeset
125 MSGTR_VO_YUV4MPEG_InterlacedInputNotRGB);
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
126 }
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
127
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
128 if (width % 2)
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
129 {
13462
01cc6b0a6e72 printf --> mp_msg transition in vo_yuv4mpeg
diego
parents: 10802
diff changeset
130 mp_msg(MSGT_VO,MSGL_FATAL,
01cc6b0a6e72 printf --> mp_msg transition in vo_yuv4mpeg
diego
parents: 10802
diff changeset
131 MSGTR_VO_YUV4MPEG_WidthDivisibleBy2);
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
132 return -1;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
133 }
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
134
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
135 if(using_format != IMGFMT_YV12)
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
136 {
10802
alex
parents: 8450
diff changeset
137 sws_rgb2rgb_init(get_sws_cpuflags());
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
138 rgb_buffer = malloc(image_width * image_height * 3);
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
139 if (!rgb_buffer)
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
140 {
13462
01cc6b0a6e72 printf --> mp_msg transition in vo_yuv4mpeg
diego
parents: 10802
diff changeset
141 mp_msg(MSGT_VO,MSGL_FATAL,
01cc6b0a6e72 printf --> mp_msg transition in vo_yuv4mpeg
diego
parents: 10802
diff changeset
142 MSGTR_VO_YUV4MPEG_NoMemRGBFrameBuf);
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
143 return -1;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
144 }
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
145 }
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
146
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
147 write_bytes = image_width * image_height * 3 / 2;
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
148 image = malloc(write_bytes);
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
149
14538
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14284
diff changeset
150 yuv_out = fopen(yuv_filename, "wb");
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
151 if (!yuv_out || image == 0)
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
152 {
13462
01cc6b0a6e72 printf --> mp_msg transition in vo_yuv4mpeg
diego
parents: 10802
diff changeset
153 mp_msg(MSGT_VO,MSGL_FATAL,
14095
367ba4601d47 Add a file= suboption to set output file.
reimar
parents: 13787
diff changeset
154 MSGTR_VO_YUV4MPEG_OutFileOpenError,
14538
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14284
diff changeset
155 yuv_filename);
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
156 return -1;
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
157 }
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
158 image_y = image;
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
159 image_u = image_y + image_width * image_height;
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
160 image_v = image_u + image_width * image_height / 4;
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
161
21805
924da043b8ce Use av_d2q to produce the fps fraction, this usually produces more sane fractions
reimar
parents: 21804
diff changeset
162 fprintf(yuv_out, "YUV4MPEG2 W%d H%d F%d:%d I%c A%d:%d\n",
924da043b8ce Use av_d2q to produce the fps fraction, this usually produces more sane fractions
reimar
parents: 21804
diff changeset
163 image_width, image_height, fps_frac.num, fps_frac.den,
924da043b8ce Use av_d2q to produce the fps fraction, this usually produces more sane fractions
reimar
parents: 21804
diff changeset
164 config_interlace,
20398
69cb57c406a8 Set aspect information in yuv4mpeg
reimar
parents: 18861
diff changeset
165 pixelaspect.num, pixelaspect.den);
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
166
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
167 fflush(yuv_out);
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
168 return 0;
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
169 }
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
170
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
171 /* Only use when h divisable by 2! */
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
172 static void swap_fields(uint8_t *ptr, const int h, const int stride)
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
173 {
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
174 int i;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
175
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
176 for (i=0; i<h; i +=2)
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
177 {
23457
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 21805
diff changeset
178 fast_memcpy(rgb_line_buffer , ptr + stride * i , stride);
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 21805
diff changeset
179 fast_memcpy(ptr + stride * i , ptr + stride * (i+1), stride);
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 21805
diff changeset
180 fast_memcpy(ptr + stride * (i+1), rgb_line_buffer , stride);
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
181 }
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
182 }
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
183
5832
041bd56e41dc added support for output of subtitles - Juergen Hammelmann <juergen.hammelmann@gmx.de>
arpi
parents: 4737
diff changeset
184 static void draw_alpha(int x0, int y0, int w, int h, unsigned char *src,
041bd56e41dc added support for output of subtitles - Juergen Hammelmann <juergen.hammelmann@gmx.de>
arpi
parents: 4737
diff changeset
185 unsigned char *srca, int stride) {
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
186 switch (using_format)
5832
041bd56e41dc added support for output of subtitles - Juergen Hammelmann <juergen.hammelmann@gmx.de>
arpi
parents: 4737
diff changeset
187 {
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
188 case IMGFMT_YV12:
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
189 vo_draw_alpha_yv12(w, h, src, srca, stride,
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
190 image + y0 * image_width + x0, image_width);
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
191 break;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
192
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
193 case IMGFMT_BGR|24:
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
194 case IMGFMT_RGB|24:
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
195 if (config_interlace != Y4M_ILACE_BOTTOM_FIRST)
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
196 vo_draw_alpha_rgb24(w, h, src, srca, stride,
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
197 rgb_buffer + (y0 * image_width + x0) * 3, image_width * 3);
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
198 else
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
199 {
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
200 swap_fields (rgb_buffer, image_height, image_width * 3);
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
201
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
202 vo_draw_alpha_rgb24(w, h, src, srca, stride,
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
203 rgb_buffer + (y0 * image_width + x0) * 3, image_width * 3);
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
204
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
205 swap_fields (rgb_buffer, image_height, image_width * 3);
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
206 }
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
207 break;
5832
041bd56e41dc added support for output of subtitles - Juergen Hammelmann <juergen.hammelmann@gmx.de>
arpi
parents: 4737
diff changeset
208 }
041bd56e41dc added support for output of subtitles - Juergen Hammelmann <juergen.hammelmann@gmx.de>
arpi
parents: 4737
diff changeset
209 }
041bd56e41dc added support for output of subtitles - Juergen Hammelmann <juergen.hammelmann@gmx.de>
arpi
parents: 4737
diff changeset
210
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
211 static void draw_osd(void)
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
212 {
5832
041bd56e41dc added support for output of subtitles - Juergen Hammelmann <juergen.hammelmann@gmx.de>
arpi
parents: 4737
diff changeset
213 vo_draw_text(image_width, image_height, draw_alpha);
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
214 }
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
215
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
216 static void deinterleave_fields(uint8_t *ptr, const int stride,
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
217 const int img_height)
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
218 {
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
219 unsigned int i, j, k_start = 1, modv = img_height - 1;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
220 unsigned char *line_state = malloc(modv);
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
221
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
222 for (i=0; i<modv; i++)
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
223 line_state[i] = 0;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
224
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
225 line_state[0] = 1;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
226
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
227 while(k_start < modv)
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
228 {
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
229 i = j = k_start;
23457
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 21805
diff changeset
230 fast_memcpy(rgb_line_buffer, ptr + stride * i, stride);
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
231
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
232 while (!line_state[j])
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
233 {
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
234 line_state[j] = 1;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
235 i = j;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
236 j = j * 2 % modv;
23457
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 21805
diff changeset
237 fast_memcpy(ptr + stride * i, ptr + stride * j, stride);
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
238 }
23457
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 21805
diff changeset
239 fast_memcpy(ptr + stride * i, rgb_line_buffer, stride);
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
240
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
241 while(k_start < modv && line_state[k_start])
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
242 k_start++;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
243 }
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
244 free(line_state);
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
245 }
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
246
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
247 static void vo_y4m_write(const void *ptr, const size_t num_bytes)
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
248 {
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
249 if (fwrite(ptr, 1, num_bytes, yuv_out) != num_bytes)
13462
01cc6b0a6e72 printf --> mp_msg transition in vo_yuv4mpeg
diego
parents: 10802
diff changeset
250 mp_msg(MSGT_VO,MSGL_ERR,
01cc6b0a6e72 printf --> mp_msg transition in vo_yuv4mpeg
diego
parents: 10802
diff changeset
251 MSGTR_VO_YUV4MPEG_OutFileWriteError);
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
252 }
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
253
8450
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
254 static int write_last_frame(void)
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
255 {
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
256
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
257 uint8_t *upper_y, *upper_u, *upper_v, *rgb_buffer_lower;
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
258 int rgb_stride, uv_stride, field_height;
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
259 unsigned int i, low_ofs;
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
260
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
261 fprintf(yuv_out, "FRAME\n");
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
262
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
263 if (using_format != IMGFMT_YV12)
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
264 {
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
265 rgb_stride = image_width * 3;
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
266 uv_stride = image_width / 2;
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
267
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
268 if (Y4M_IS_INTERLACED)
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
269 {
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
270 field_height = image_height / 2;
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
271
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
272 upper_y = image;
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
273 upper_u = upper_y + image_width * field_height;
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
274 upper_v = upper_u + image_width * field_height / 4;
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
275 low_ofs = image_width * field_height * 3 / 2;
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
276 rgb_buffer_lower = rgb_buffer + rgb_stride * field_height;
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
277
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
278 /* Write Y plane */
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
279 for(i = 0; i < field_height; i++)
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
280 {
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
281 vo_y4m_write(upper_y + image_width * i, image_width);
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
282 vo_y4m_write(upper_y + image_width * i + low_ofs, image_width);
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
283 }
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
284
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
285 /* Write U and V plane */
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
286 for(i = 0; i < field_height / 2; i++)
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
287 {
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
288 vo_y4m_write(upper_u + uv_stride * i, uv_stride);
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
289 vo_y4m_write(upper_u + uv_stride * i + low_ofs, uv_stride);
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
290 }
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
291 for(i = 0; i < field_height / 2; i++)
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
292 {
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
293 vo_y4m_write(upper_v + uv_stride * i, uv_stride);
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
294 vo_y4m_write(upper_v + uv_stride * i + low_ofs, uv_stride);
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
295 }
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
296 return VO_TRUE; /* Image written; We have to stop here */
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
297 }
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
298 }
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
299 /* Write progressive frame */
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
300 vo_y4m_write(image, write_bytes);
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
301 return VO_TRUE;
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
302 }
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
303
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
304 static void flip_page (void)
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
305 {
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
306 uint8_t *upper_y, *upper_u, *upper_v, *rgb_buffer_lower;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
307 int rgb_stride, uv_stride, field_height;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
308 unsigned int i, low_ofs;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
309
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
310 fprintf(yuv_out, "FRAME\n");
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
311
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
312 if (using_format != IMGFMT_YV12)
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
313 {
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
314 rgb_stride = image_width * 3;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
315 uv_stride = image_width / 2;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
316
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
317 if (Y4M_IS_INTERLACED)
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
318 {
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
319 field_height = image_height / 2;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
320
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
321 upper_y = image;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
322 upper_u = upper_y + image_width * field_height;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
323 upper_v = upper_u + image_width * field_height / 4;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
324 low_ofs = image_width * field_height * 3 / 2;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
325 rgb_buffer_lower = rgb_buffer + rgb_stride * field_height;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
326
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
327 deinterleave_fields(rgb_buffer, rgb_stride, image_height);
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
328
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
329 rgb24toyv12(rgb_buffer, upper_y, upper_u, upper_v,
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
330 image_width, field_height,
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
331 image_width, uv_stride, rgb_stride);
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
332 rgb24toyv12(rgb_buffer_lower, upper_y + low_ofs,
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
333 upper_u + low_ofs, upper_v + low_ofs,
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
334 image_width, field_height,
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
335 image_width, uv_stride, rgb_stride);
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
336
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
337 /* Write Y plane */
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
338 for(i = 0; i < field_height; i++)
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
339 {
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
340 vo_y4m_write(upper_y + image_width * i, image_width);
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
341 vo_y4m_write(upper_y + image_width * i + low_ofs, image_width);
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
342 }
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
343
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
344 /* Write U and V plane */
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
345 for(i = 0; i < field_height / 2; i++)
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
346 {
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
347 vo_y4m_write(upper_u + uv_stride * i, uv_stride);
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
348 vo_y4m_write(upper_u + uv_stride * i + low_ofs, uv_stride);
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
349 }
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
350 for(i = 0; i < field_height / 2; i++)
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
351 {
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
352 vo_y4m_write(upper_v + uv_stride * i, uv_stride);
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
353 vo_y4m_write(upper_v + uv_stride * i + low_ofs, uv_stride);
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
354 }
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
355 return; /* Image written; We have to stop here */
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
356 }
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
357
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
358 rgb24toyv12(rgb_buffer, image_y, image_u, image_v,
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
359 image_width, image_height,
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
360 image_width, uv_stride, rgb_stride);
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
361 }
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
362
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
363 /* Write progressive frame */
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
364 vo_y4m_write(image, write_bytes);
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
365 }
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
366
16171
fd51fd1ff231 Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents: 15212
diff changeset
367 static int draw_slice(uint8_t *srcimg[], int stride[], int w,int h,int x,int y)
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
368 {
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
369 int i;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
370 uint8_t *dst, *src = srcimg[0];
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
371
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
372 switch (using_format)
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
373 {
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
374 case IMGFMT_YV12:
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
375
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
376 // copy Y:
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
377 dst = image_y + image_width * y + x;
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
378 for (i = 0; i < h; i++)
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
379 {
23457
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 21805
diff changeset
380 fast_memcpy(dst, src, w);
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
381 src += stride[0];
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
382 dst += image_width;
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
383 }
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
384 {
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
385 // copy U + V:
4706
a4400910be9f yv12 slices fix by Robert Kesterson <robertk@robertk.com>
arpi
parents: 4640
diff changeset
386 int imgstride = image_width >> 1;
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
387 uint8_t *src1 = srcimg[1];
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
388 uint8_t *src2 = srcimg[2];
4706
a4400910be9f yv12 slices fix by Robert Kesterson <robertk@robertk.com>
arpi
parents: 4640
diff changeset
389 uint8_t *dstu = image_u + imgstride * (y >> 1) + (x >> 1);
a4400910be9f yv12 slices fix by Robert Kesterson <robertk@robertk.com>
arpi
parents: 4640
diff changeset
390 uint8_t *dstv = image_v + imgstride * (y >> 1) + (x >> 1);
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
391 for (i = 0; i < h / 2; i++)
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
392 {
23457
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 21805
diff changeset
393 fast_memcpy(dstu, src1 , w >> 1);
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 21805
diff changeset
394 fast_memcpy(dstv, src2, w >> 1);
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
395 src1 += stride[1];
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
396 src2 += stride[2];
4706
a4400910be9f yv12 slices fix by Robert Kesterson <robertk@robertk.com>
arpi
parents: 4640
diff changeset
397 dstu += imgstride;
a4400910be9f yv12 slices fix by Robert Kesterson <robertk@robertk.com>
arpi
parents: 4640
diff changeset
398 dstv += imgstride;
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
399 }
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
400 }
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
401 break;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
402
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
403 case IMGFMT_BGR24:
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
404 case IMGFMT_RGB24:
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
405 dst = rgb_buffer + (image_width * y + x) * 3;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
406 for (i = 0; i < h; i++)
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
407 {
23457
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 21805
diff changeset
408 fast_memcpy(dst, src, w * 3);
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
409 src += stride[0];
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
410 dst += image_width * 3;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
411 }
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
412 break;
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
413 }
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
414 return 0;
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
415 }
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
416
16171
fd51fd1ff231 Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents: 15212
diff changeset
417 static int draw_frame(uint8_t * src[])
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
418 {
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
419 switch(using_format)
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
420 {
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
421 case IMGFMT_YV12:
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
422 // gets done in draw_slice
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
423 break;
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
424
7688
41d242c5bee1 since draw_slice() can handle packed RGB too, set the VFCAP_ACCEPT_STRIDE flag
arpi
parents: 7124
diff changeset
425 case IMGFMT_BGR24:
41d242c5bee1 since draw_slice() can handle packed RGB too, set the VFCAP_ACCEPT_STRIDE flag
arpi
parents: 7124
diff changeset
426 case IMGFMT_RGB24:
23457
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 21805
diff changeset
427 fast_memcpy(rgb_buffer, src[0], image_width * image_height * 3);
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
428 break;
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
429 }
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
430 return 0;
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
431 }
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
432
16171
fd51fd1ff231 Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents: 15212
diff changeset
433 static int query_format(uint32_t format)
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
434 {
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
435
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
436 if (Y4M_IS_INTERLACED)
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
437 {
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
438 /* When processing interlaced material we want to get the raw RGB
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
439 * data and do the YV12 conversion ourselves to have the chrominance
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
440 * information sampled correct. */
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
441
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
442 switch(format)
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
443 {
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
444 case IMGFMT_YV12:
7688
41d242c5bee1 since draw_slice() can handle packed RGB too, set the VFCAP_ACCEPT_STRIDE flag
arpi
parents: 7124
diff changeset
445 return VFCAP_CSP_SUPPORTED|VFCAP_OSD|VFCAP_ACCEPT_STRIDE;
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
446 case IMGFMT_BGR|24:
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
447 case IMGFMT_RGB|24:
7688
41d242c5bee1 since draw_slice() can handle packed RGB too, set the VFCAP_ACCEPT_STRIDE flag
arpi
parents: 7124
diff changeset
448 return VFCAP_CSP_SUPPORTED|VFCAP_CSP_SUPPORTED_BY_HW|VFCAP_OSD|VFCAP_ACCEPT_STRIDE;
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
449 }
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
450 }
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
451 else
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
452 {
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
453
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
454 switch(format)
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
455 {
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
456 case IMGFMT_YV12:
7688
41d242c5bee1 since draw_slice() can handle packed RGB too, set the VFCAP_ACCEPT_STRIDE flag
arpi
parents: 7124
diff changeset
457 return VFCAP_CSP_SUPPORTED|VFCAP_CSP_SUPPORTED_BY_HW|VFCAP_OSD|VFCAP_ACCEPT_STRIDE;
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
458 case IMGFMT_BGR|24:
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
459 case IMGFMT_RGB|24:
7688
41d242c5bee1 since draw_slice() can handle packed RGB too, set the VFCAP_ACCEPT_STRIDE flag
arpi
parents: 7124
diff changeset
460 return VFCAP_CSP_SUPPORTED|VFCAP_OSD|VFCAP_ACCEPT_STRIDE;
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
461 }
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
462 }
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
463 return 0;
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
464 }
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
465
14145
9c47f90ad94a fix leak with -fixed-vo, allow concatenating
reimar
parents: 14095
diff changeset
466 // WARNING: config(...) also uses this
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
467 static void uninit(void)
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
468 {
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
469 if(image)
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
470 free(image);
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
471 image = NULL;
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
472
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
473 if(yuv_out)
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
474 fclose(yuv_out);
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
475 yuv_out = NULL;
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
476
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
477 if(rgb_buffer)
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
478 free(rgb_buffer);
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
479 rgb_buffer = NULL;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
480
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
481 if(rgb_line_buffer)
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
482 free(rgb_line_buffer);
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
483 rgb_line_buffer = NULL;
14095
367ba4601d47 Add a file= suboption to set output file.
reimar
parents: 13787
diff changeset
484
367ba4601d47 Add a file= suboption to set output file.
reimar
parents: 13787
diff changeset
485 if (yuv_filename)
367ba4601d47 Add a file= suboption to set output file.
reimar
parents: 13787
diff changeset
486 free(yuv_filename);
367ba4601d47 Add a file= suboption to set output file.
reimar
parents: 13787
diff changeset
487 yuv_filename = NULL;
14145
9c47f90ad94a fix leak with -fixed-vo, allow concatenating
reimar
parents: 14095
diff changeset
488 image_width = 0;
9c47f90ad94a fix leak with -fixed-vo, allow concatenating
reimar
parents: 14095
diff changeset
489 image_height = 0;
9c47f90ad94a fix leak with -fixed-vo, allow concatenating
reimar
parents: 14095
diff changeset
490 image_fps = 0;
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
491 }
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
492
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
493
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
494 static void check_events(void)
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
495 {
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
496 }
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
497
16171
fd51fd1ff231 Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents: 15212
diff changeset
498 static int preinit(const char *arg)
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
499 {
14284
08399423fe30 Use subopt parser
reimar
parents: 14145
diff changeset
500 int il, il_bf;
08399423fe30 Use subopt parser
reimar
parents: 14145
diff changeset
501 opt_t subopts[] = {
08399423fe30 Use subopt parser
reimar
parents: 14145
diff changeset
502 {"interlaced", OPT_ARG_BOOL, &il, NULL},
08399423fe30 Use subopt parser
reimar
parents: 14145
diff changeset
503 {"interlaced_bf", OPT_ARG_BOOL, &il_bf, NULL},
14538
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14284
diff changeset
504 {"file", OPT_ARG_MSTRZ, &yuv_filename, NULL},
14284
08399423fe30 Use subopt parser
reimar
parents: 14145
diff changeset
505 {NULL}
08399423fe30 Use subopt parser
reimar
parents: 14145
diff changeset
506 };
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
507
14284
08399423fe30 Use subopt parser
reimar
parents: 14145
diff changeset
508 il = 0;
08399423fe30 Use subopt parser
reimar
parents: 14145
diff changeset
509 il_bf = 0;
14538
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14284
diff changeset
510 yuv_filename = strdup("stream.yuv");
14284
08399423fe30 Use subopt parser
reimar
parents: 14145
diff changeset
511 if (subopt_parse(arg, subopts) != 0) {
08399423fe30 Use subopt parser
reimar
parents: 14145
diff changeset
512 mp_msg(MSGT_VO, MSGL_FATAL, MSGTR_VO_YUV4MPEG_UnknownSubDev, arg);
08399423fe30 Use subopt parser
reimar
parents: 14145
diff changeset
513 return -1;
08399423fe30 Use subopt parser
reimar
parents: 14145
diff changeset
514 }
08399423fe30 Use subopt parser
reimar
parents: 14145
diff changeset
515
08399423fe30 Use subopt parser
reimar
parents: 14145
diff changeset
516 config_interlace = Y4M_ILACE_NONE;
08399423fe30 Use subopt parser
reimar
parents: 14145
diff changeset
517 if (il)
08399423fe30 Use subopt parser
reimar
parents: 14145
diff changeset
518 config_interlace = Y4M_ILACE_TOP_FIRST;
08399423fe30 Use subopt parser
reimar
parents: 14145
diff changeset
519 if (il_bf)
08399423fe30 Use subopt parser
reimar
parents: 14145
diff changeset
520 config_interlace = Y4M_ILACE_BOTTOM_FIRST;
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
521
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
522 /* Inform user which output mode is used */
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
523 switch (config_interlace)
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
524 {
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
525 case Y4M_ILACE_TOP_FIRST:
13462
01cc6b0a6e72 printf --> mp_msg transition in vo_yuv4mpeg
diego
parents: 10802
diff changeset
526 mp_msg(MSGT_VO,MSGL_STATUS,
01cc6b0a6e72 printf --> mp_msg transition in vo_yuv4mpeg
diego
parents: 10802
diff changeset
527 MSGTR_VO_YUV4MPEG_InterlacedTFFMode);
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
528 break;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
529 case Y4M_ILACE_BOTTOM_FIRST:
13462
01cc6b0a6e72 printf --> mp_msg transition in vo_yuv4mpeg
diego
parents: 10802
diff changeset
530 mp_msg(MSGT_VO,MSGL_STATUS,
01cc6b0a6e72 printf --> mp_msg transition in vo_yuv4mpeg
diego
parents: 10802
diff changeset
531 MSGTR_VO_YUV4MPEG_InterlacedBFFMode);
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
532 break;
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
533 default:
13462
01cc6b0a6e72 printf --> mp_msg transition in vo_yuv4mpeg
diego
parents: 10802
diff changeset
534 mp_msg(MSGT_VO,MSGL_STATUS,
01cc6b0a6e72 printf --> mp_msg transition in vo_yuv4mpeg
diego
parents: 10802
diff changeset
535 MSGTR_VO_YUV4MPEG_ProgressiveMode);
6659
715d93d492c3 interlacing support - Klaus Stengel <ks1@inter-ject.de>
arpi
parents: 6213
diff changeset
536 break;
4737
32e1f5042f65 I don't like such reports: '-vo dga:vidix or -vo x11:vidix works fine for me'
nick
parents: 4706
diff changeset
537 }
32e1f5042f65 I don't like such reports: '-vo dga:vidix or -vo x11:vidix works fine for me'
nick
parents: 4706
diff changeset
538 return 0;
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
539 }
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
540
16171
fd51fd1ff231 Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents: 15212
diff changeset
541 static int control(uint32_t request, void *data, ...)
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
542 {
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
543 switch (request) {
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
544 case VOCTRL_QUERY_FORMAT:
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
545 return query_format(*((uint32_t*)data));
8450
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
546 case VOCTRL_DUPLICATE_FRAME:
8cfc9309f0cc notice vo driver about skipped/dropped frames
arpi
parents: 8148
diff changeset
547 return write_last_frame();
4597
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
548 }
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
549 return VO_NOTIMPL;
4ba62f7d04c6 yuv4mpeg output, by Robert Kesterson <robertk@robertk.com>
arpi
parents:
diff changeset
550 }