Mercurial > mplayer.hg
annotate libmpdemux/demux_y4m.c @ 35684:7801d585b06c
Support fourcc ZMP4.
Based on a patch by Luca Barbato.
author | cehoyos |
---|---|
date | Fri, 18 Jan 2013 09:20:23 +0000 |
parents | ef57345fe3e8 |
children | 139f2b064ef9 |
rev | line source |
---|---|
29238
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
1 /* |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
2 * Y4M file parser |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
3 * copyright (c) 2001 Rik Snel |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
4 * (using yuv4mpeg*.[ch] from mjpeg.sourceforge.net) |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
5 * (derived from demux_viv.c) |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
6 * older YUV4MPEG (used by xawtv) support by Alex Beregszaszi |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
7 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
8 * This file is part of MPlayer. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
9 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
10 * MPlayer is free software; you can redistribute it and/or modify |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
11 * it under the terms of the GNU General Public License as published by |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
12 * the Free Software Foundation; either version 2 of the License, or |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
13 * (at your option) any later version. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
14 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
15 * MPlayer is distributed in the hope that it will be useful, |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
18 * GNU General Public License for more details. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
19 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
20 * You should have received a copy of the GNU General Public License along |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
21 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
23 */ |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
24 |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
25 #include <stdio.h> |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
26 #include <stdlib.h> |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
27 #include <unistd.h> |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
28 #include <string.h> /* strtok */ |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
29 |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
30 #include "config.h" |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
31 #include "mp_msg.h" |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
32 #include "help_mp.h" |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
33 #include "yuv4mpeg.h" |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
34 |
22605
4d81dbdf46b9
Add explicit location for headers from the stream/ directory.
diego
parents:
21421
diff
changeset
|
35 //#include "stream/stream.h" |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
36 #include "demuxer.h" |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
37 #include "stheader.h" |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
38 |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
39 typedef struct { |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
40 int framenum; |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
41 y4m_stream_info_t* si; |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
42 int is_older; |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
43 } y4m_priv_t; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
44 |
16175 | 45 static int y4m_check_file(demuxer_t* demuxer){ |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
46 int orig_pos = stream_tell(demuxer->stream); |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
47 char buf[10]; |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
48 y4m_priv_t* priv; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
49 |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
50 mp_msg(MSGT_DEMUX, MSGL_V, "Checking for YUV4MPEG2\n"); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
51 |
15817 | 52 if(stream_read(demuxer->stream, buf, 9)!=9) |
53 return 0; | |
54 | |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
55 buf[9] = 0; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
56 |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
57 if (strncmp("YUV4MPEG2", buf, 9) && strncmp("YUV4MPEG ", buf, 9)) { |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
58 return 0; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
59 } |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
60 |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
61 demuxer->priv = malloc(sizeof(y4m_priv_t)); |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
62 priv = demuxer->priv; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
63 |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
64 priv->is_older = 0; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
65 |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
66 if (!strncmp("YUV4MPEG ", buf, 9)) |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
67 { |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
68 mp_msg(MSGT_DEMUX, MSGL_V, "Found older YUV4MPEG format (used by xawtv)\n"); |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
69 priv->is_older = 1; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
70 } |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
71 |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
72 mp_msg(MSGT_DEMUX,MSGL_DBG2,"Success: YUV4MPEG2\n"); |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
73 |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
74 stream_seek(demuxer->stream, orig_pos); |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
75 |
16175 | 76 return DEMUXER_TYPE_Y4M; |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
77 } |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
78 |
30928 | 79 static void read_streaminfo(demuxer_t *demuxer); |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
80 |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
81 // return value: |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
82 // 0 = EOF or no stream found |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
83 // 1 = successfully read a packet |
16175 | 84 static int demux_y4m_fill_buffer(demuxer_t *demux, demux_stream_t *dsds) { |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
85 demux_stream_t *ds=demux->video; |
35291 | 86 demux_packet_t *dp = NULL; |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
87 y4m_priv_t *priv=demux->priv; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
88 y4m_frame_info_t fi; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
89 unsigned char *buf[3]; |
35290 | 90 int size; |
30928 | 91 int nextc; |
92 | |
93 nextc = stream_read_char(demux->stream); | |
94 stream_skip(demux->stream, -1); | |
95 if (nextc == 'Y') { | |
96 read_streaminfo(demux); | |
97 demux->seekable = 0; | |
98 } | |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
99 |
9654
ee7203b48e7c
fix crash on streams with frame tags, patch by Brett Kosinski <brettk@frodo.dyn.gno.org>
alex
parents:
5810
diff
changeset
|
100 y4m_init_frame_info(&fi); |
ee7203b48e7c
fix crash on streams with frame tags, patch by Brett Kosinski <brettk@frodo.dyn.gno.org>
alex
parents:
5810
diff
changeset
|
101 |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
102 demux->filepos=stream_tell(demux->stream); |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
103 |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
104 size = ((sh_video_t*)ds->sh)->disp_w*((sh_video_t*)ds->sh)->disp_h; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
105 |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
106 dp = new_demux_packet(3*size/2); |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
107 |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
108 /* swap U and V components */ |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
109 buf[0] = dp->buffer; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
110 buf[1] = dp->buffer + 5*size/4; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
111 buf[2] = dp->buffer + size; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
112 |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
113 if (priv->is_older) |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
114 { |
35290 | 115 int c = stream_read_char(demux->stream); /* F */ |
3790 | 116 if (c == -256) |
35291 | 117 goto err_out; /* EOF */ |
3790 | 118 if (c != 'F') |
119 { | |
3863 | 120 mp_msg(MSGT_DEMUX, MSGL_V, "Bad frame at %d\n", (int)stream_tell(demux->stream)-1); |
35291 | 121 goto err_out; |
3790 | 122 } |
123 stream_skip(demux->stream, 5); /* RAME\n */ | |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
124 stream_read(demux->stream, buf[0], size); |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
125 stream_read(demux->stream, buf[1], size/4); |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
126 stream_read(demux->stream, buf[2], size/4); |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
127 } |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
128 else |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
129 { |
35290 | 130 int err = y4m_read_frame(demux->stream, priv->si, &fi, buf); |
131 if (err != Y4M_OK) { | |
31398 | 132 mp_msg(MSGT_DEMUX, MSGL_ERR, "error reading frame %s\n", y4m_strerr(err)); |
35291 | 133 goto err_out; |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
134 } |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
135 } |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
136 |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
137 /* This seems to be the right way to calculate the presentation time stamp */ |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
138 dp->pts=(float)priv->framenum/((sh_video_t*)ds->sh)->fps; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
139 priv->framenum++; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
140 dp->pos=demux->filepos; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
141 dp->flags=0; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
142 ds_add_packet(ds, dp); |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
143 |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
144 return 1; |
35291 | 145 |
146 err_out: | |
147 if (dp) | |
148 free_demux_packet(dp); | |
149 return 0; | |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
150 } |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
151 |
30928 | 152 static void read_streaminfo(demuxer_t *demuxer) |
153 { | |
154 y4m_priv_t *priv = demuxer->priv; | |
155 sh_video_t *sh = demuxer->video->sh; | |
3800 | 156 y4m_ratio_t ratio; |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
157 int err; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
158 |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
159 if (priv->is_older) |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
160 { |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
161 char buf[4]; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
162 int frame_rate_code; |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
163 |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
164 stream_skip(demuxer->stream, 8); /* YUV4MPEG */ |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
165 stream_skip(demuxer->stream, 1); /* space */ |
35290 | 166 stream_read(demuxer->stream, buf, 3); |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
167 buf[3] = 0; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
168 sh->disp_w = atoi(buf); |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
169 stream_skip(demuxer->stream, 1); /* space */ |
35290 | 170 stream_read(demuxer->stream, buf, 3); |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
171 buf[3] = 0; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
172 sh->disp_h = atoi(buf); |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
173 stream_skip(demuxer->stream, 1); /* space */ |
35290 | 174 stream_read(demuxer->stream, buf, 1); |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
175 buf[1] = 0; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
176 frame_rate_code = atoi(buf); |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
177 stream_skip(demuxer->stream, 1); /* new-line */ |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
178 |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
179 if (!sh->fps) |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
180 { |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
181 /* values from xawtv */ |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
182 switch(frame_rate_code) |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
183 { |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
184 case 1: |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
185 sh->fps = 23.976f; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
186 break; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
187 case 2: |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
188 sh->fps = 24.0f; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
189 break; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
190 case 3: |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
191 sh->fps = 25.0f; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
192 break; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
193 case 4: |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
194 sh->fps = 29.97f; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
195 break; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
196 case 5: |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
197 sh->fps = 30.0f; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
198 break; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
199 case 6: |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
200 sh->fps = 50.0f; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
201 break; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
202 case 7: |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
203 sh->fps = 59.94f; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
204 break; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
205 case 8: |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
206 sh->fps = 60.0f; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
207 break; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
208 default: |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
209 sh->fps = 25.0f; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
210 } |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
211 } |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
212 sh->frametime = 1.0f/sh->fps; |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
213 } |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
214 else |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
215 { |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
216 y4m_init_stream_info(priv->si); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
217 if ((err=y4m_read_stream_header(demuxer->stream, priv->si)) != Y4M_OK) |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
218 mp_msg(MSGT_DEMUXER, MSGL_FATAL, "error parsing YUV4MPEG header: %s\n", y4m_strerr(err)); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
219 |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
220 if(!sh->fps) { |
3800 | 221 ratio = y4m_si_get_framerate(priv->si); |
222 if (ratio.d != 0) | |
223 sh->fps=(float)ratio.n/(float)ratio.d; | |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
224 else |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
225 sh->fps=15.0f; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
226 } |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
227 sh->frametime=1.0f/sh->fps; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
228 |
3800 | 229 ratio = y4m_si_get_sampleaspect(priv->si); |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
230 |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
231 sh->disp_w = y4m_si_get_width(priv->si); |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
232 sh->disp_h = y4m_si_get_height(priv->si); |
12529
74968e3440ff
fix bug reported by Leonardo Giordani: sh->aspect is not pixel aspect but movie aspect
rik
parents:
9654
diff
changeset
|
233 |
74968e3440ff
fix bug reported by Leonardo Giordani: sh->aspect is not pixel aspect but movie aspect
rik
parents:
9654
diff
changeset
|
234 if (ratio.d != 0 && ratio.n != 0) |
74968e3440ff
fix bug reported by Leonardo Giordani: sh->aspect is not pixel aspect but movie aspect
rik
parents:
9654
diff
changeset
|
235 sh->aspect = (float)(sh->disp_w*ratio.n)/(float)(sh->disp_h*ratio.d); |
74968e3440ff
fix bug reported by Leonardo Giordani: sh->aspect is not pixel aspect but movie aspect
rik
parents:
9654
diff
changeset
|
236 |
3863 | 237 demuxer->seekable = 0; |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
238 } |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
239 |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
240 sh->format = mmioFOURCC('Y', 'V', '1', '2'); |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
241 |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
242 sh->bih->biSize=40; |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
243 sh->bih->biWidth = sh->disp_w; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
244 sh->bih->biHeight = sh->disp_h; |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
245 sh->bih->biPlanes=3; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
246 sh->bih->biBitCount=12; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
247 sh->bih->biCompression=sh->format; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
248 sh->bih->biSizeImage=sh->bih->biWidth*sh->bih->biHeight*3/2; /* YV12 */ |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
249 |
30928 | 250 mp_msg(MSGT_DEMUX, MSGL_INFO, "YUV4MPEG2 Video stream %d size: display: %dx%d, codec: %ux%u\n", |
251 demuxer->video->id, sh->disp_w, sh->disp_h, sh->bih->biWidth, | |
252 sh->bih->biHeight); | |
253 } | |
254 | |
255 static demuxer_t* demux_open_y4m(demuxer_t* demuxer){ | |
256 y4m_priv_t* priv = demuxer->priv; | |
257 sh_video_t* sh=new_sh_video(demuxer,0); | |
258 | |
259 priv->framenum = 0; | |
260 priv->si = malloc(sizeof(y4m_stream_info_t)); | |
261 | |
32105 | 262 sh->bih=calloc(1, sizeof(*sh->bih)); |
30928 | 263 |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
264 demuxer->video->sh=sh; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
265 sh->ds=demuxer->video; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
266 demuxer->video->id=0; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
267 |
30928 | 268 read_streaminfo(demuxer); |
16175 | 269 |
270 return demuxer; | |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
271 } |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
272 |
17636 | 273 static void demux_seek_y4m(demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int flags) { |
3863 | 274 sh_video_t* sh = demuxer->video->sh; |
275 y4m_priv_t* priv = demuxer->priv; | |
276 int rel_seek_frames = sh->fps*rel_seek_secs; | |
277 int size = 3*sh->disp_w*sh->disp_h/2; | |
278 off_t curr_pos = stream_tell(demuxer->stream); | |
279 | |
280 if (priv->framenum + rel_seek_frames < 0) rel_seek_frames = -priv->framenum; | |
281 | |
282 //printf("seektoframe=%d rel_seek_secs=%f seektooffset=%ld\n", priv->framenum + rel_seek_frames, rel_seek_secs, curr_pos + rel_seek_frames*(size+6)); | |
283 //printf("framenum=%d, curr_pos=%ld, currpos/(size+6)=%f\n", priv->framenum, curr_pos, (float)curr_pos/(float)(size+6)); | |
284 priv->framenum += rel_seek_frames; | |
285 | |
286 if (priv->is_older) { | |
287 /* Well this is easy: every frame takes up size+6 bytes | |
288 * in the stream and we may assume that the stream pointer | |
289 * is always at the beginning of a frame. | |
290 * framenum is the number of the frame that is about to be | |
291 * demuxed (counting from ONE (see demux_open_y4m)) */ | |
292 stream_seek(demuxer->stream, curr_pos + rel_seek_frames*(size+6)); | |
293 } else { | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
294 /* should never come here, because seeking for YUV4MPEG2 |
3863 | 295 * is disabled. */ |
296 mp_msg(MSGT_DEMUX, MSGL_WARN, "Seeking for YUV4MPEG2 not yet implemented!\n"); | |
297 } | |
298 } | |
299 | |
16175 | 300 static void demux_close_y4m(demuxer_t *demuxer) |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
301 { |
3800 | 302 y4m_priv_t* priv = demuxer->priv; |
5810 | 303 |
304 if(!priv) | |
305 return; | |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
306 if (!priv->is_older) |
35290 | 307 y4m_fini_stream_info(priv->si); |
308 free(priv->si); | |
309 free(priv); | |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
310 return; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
311 } |
16175 | 312 |
313 | |
25707
d4fe6e23283e
Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents:
22605
diff
changeset
|
314 const demuxer_desc_t demuxer_desc_y4m = { |
16175 | 315 "YUV4MPEG2 demuxer", |
316 "y4m", | |
317 "YUV4MPEG2", | |
318 "Rik snel", | |
319 "", | |
320 DEMUXER_TYPE_Y4M, | |
321 1, // safe autodetect | |
322 y4m_check_file, | |
323 demux_y4m_fill_buffer, | |
324 demux_open_y4m, | |
325 demux_close_y4m, | |
326 demux_seek_y4m, | |
327 NULL | |
328 }; |