Mercurial > mplayer.hg
annotate libmpdemux/demux_y4m.c @ 35418:cedb0ba2b5c6
Move the code to set guiInfo's Track, Chapter and Angle start values.
Set them before checking whether there is any media opened, because
with no media opened we clear the counters.
author | ib |
---|---|
date | Thu, 29 Nov 2012 14:11:03 +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 }; |