Mercurial > mplayer.hg
annotate libmpdemux/demux_y4m.c @ 15205:19243f85e164
nico partially fixed the bug i reported; here's the rest of the fix.
basically demux_audio was mixing data in its header buffer in a bogus
manner, whereby it could sometimes "make up" valid mpeg headers where
no such header actually occurred in the file. it should be correct now.
btw these changes also fix the bug where mplayer reports huge initial
cpu usage for sound when playing mp3 files.
author | rfelker |
---|---|
date | Sun, 17 Apr 2005 17:17:52 +0000 |
parents | 74968e3440ff |
children | cce2717344f4 |
rev | line source |
---|---|
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
1 // Y4M file parser by Rik Snel (using yuv4mpeg*.[ch] from |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
2 // mjpeg.sourceforge.net) (derived from demux_viv.c) |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
3 // older YUV4MPEG (used by xawtv) support by Alex Beregszaszi |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
4 |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
5 #include <stdio.h> |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
6 #include <stdlib.h> |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
7 #include <unistd.h> |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
8 #include <string.h> /* strtok */ |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
9 |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
10 #include "config.h" |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
11 #include "mp_msg.h" |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
12 #include "help_mp.h" |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
13 #include "yuv4mpeg.h" |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
14 |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
15 //#include "stream.h" |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
16 #include "demuxer.h" |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
17 #include "stheader.h" |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
18 #include "bswap.h" |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
19 |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
20 typedef struct { |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
21 int framenum; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
22 y4m_stream_info_t* si; |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
23 int is_older; |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
24 } y4m_priv_t; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
25 |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
26 int y4m_check_file(demuxer_t* demuxer){ |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
27 int orig_pos = stream_tell(demuxer->stream); |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
28 char buf[10]; |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
29 y4m_priv_t* priv; |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
30 |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
31 mp_msg(MSGT_DEMUX, MSGL_V, "Checking for YUV4MPEG2\n"); |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
32 |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
33 stream_read(demuxer->stream, buf, 9); |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
34 buf[9] = 0; |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
35 |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
36 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
|
37 return 0; |
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 |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
40 demuxer->priv = malloc(sizeof(y4m_priv_t)); |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
41 priv = demuxer->priv; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
42 |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
43 priv->is_older = 0; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
44 |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
45 if (!strncmp("YUV4MPEG ", buf, 9)) |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
46 { |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
47 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
|
48 priv->is_older = 1; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
49 } |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
50 |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
51 mp_msg(MSGT_DEMUX,MSGL_DBG2,"Success: YUV4MPEG2\n"); |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
52 |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
53 stream_seek(demuxer->stream, orig_pos); |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
54 |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
55 return 1; |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
56 } |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
57 |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
58 |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
59 // return value: |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
60 // 0 = EOF or no stream found |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
61 // 1 = successfully read a packet |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
62 int demux_y4m_fill_buffer(demuxer_t *demux) { |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
63 demux_stream_t *ds=demux->video; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
64 demux_packet_t *dp; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
65 y4m_priv_t *priv=demux->priv; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
66 y4m_frame_info_t fi; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
67 unsigned char *buf[3]; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
68 int err, size; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
69 |
9654
ee7203b48e7c
fix crash on streams with frame tags, patch by Brett Kosinski <brettk@frodo.dyn.gno.org>
alex
parents:
5810
diff
changeset
|
70 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
|
71 |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
72 demux->filepos=stream_tell(demux->stream); |
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 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
|
75 |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
76 dp = new_demux_packet(3*size/2); |
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 /* swap U and V components */ |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
79 buf[0] = dp->buffer; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
80 buf[1] = dp->buffer + 5*size/4; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
81 buf[2] = dp->buffer + size; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
82 |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
83 if (priv->is_older) |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
84 { |
3790 | 85 int c; |
86 | |
87 c = stream_read_char(demux->stream); /* F */ | |
88 if (c == -256) | |
89 return 0; /* EOF */ | |
90 if (c != 'F') | |
91 { | |
3863 | 92 mp_msg(MSGT_DEMUX, MSGL_V, "Bad frame at %d\n", (int)stream_tell(demux->stream)-1); |
3790 | 93 return 0; |
94 } | |
95 stream_skip(demux->stream, 5); /* RAME\n */ | |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
96 stream_read(demux->stream, buf[0], size); |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
97 stream_read(demux->stream, buf[1], size/4); |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
98 stream_read(demux->stream, buf[2], size/4); |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
99 } |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
100 else |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
101 { |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
102 if ((err=y4m_read_frame(demux->stream, priv->si, &fi, buf)) != Y4M_OK) { |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
103 mp_msg(MSGT_DEMUX, MSGL_V, "error reading frame %s\n", y4m_strerr(err)); |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
104 return 0; |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
105 } |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
106 } |
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 /* 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
|
109 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
|
110 priv->framenum++; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
111 dp->pos=demux->filepos; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
112 dp->flags=0; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
113 ds_add_packet(ds, dp); |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
114 |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
115 return 1; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
116 } |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
117 |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
118 void demux_open_y4m(demuxer_t* demuxer){ |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
119 y4m_priv_t* priv = demuxer->priv; |
3800 | 120 y4m_ratio_t ratio; |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
121 sh_video_t* sh=new_sh_video(demuxer,0); |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
122 int err; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
123 |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
124 priv->framenum = 0; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
125 priv->si = malloc(sizeof(y4m_stream_info_t)); |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
126 |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
127 if (priv->is_older) |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
128 { |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
129 char buf[4]; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
130 int frame_rate_code; |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
131 |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
132 stream_skip(demuxer->stream, 8); /* YUV4MPEG */ |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
133 stream_skip(demuxer->stream, 1); /* space */ |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
134 stream_read(demuxer->stream, (char *)&buf[0], 3); |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
135 buf[3] = 0; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
136 sh->disp_w = atoi(buf); |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
137 stream_skip(demuxer->stream, 1); /* space */ |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
138 stream_read(demuxer->stream, (char *)&buf[0], 3); |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
139 buf[3] = 0; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
140 sh->disp_h = atoi(buf); |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
141 stream_skip(demuxer->stream, 1); /* space */ |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
142 stream_read(demuxer->stream, (char *)&buf[0], 1); |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
143 buf[1] = 0; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
144 frame_rate_code = atoi(buf); |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
145 stream_skip(demuxer->stream, 1); /* new-line */ |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
146 |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
147 if (!sh->fps) |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
148 { |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
149 /* values from xawtv */ |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
150 switch(frame_rate_code) |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
151 { |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
152 case 1: |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
153 sh->fps = 23.976f; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
154 break; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
155 case 2: |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
156 sh->fps = 24.0f; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
157 break; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
158 case 3: |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
159 sh->fps = 25.0f; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
160 break; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
161 case 4: |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
162 sh->fps = 29.97f; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
163 break; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
164 case 5: |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
165 sh->fps = 30.0f; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
166 break; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
167 case 6: |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
168 sh->fps = 50.0f; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
169 break; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
170 case 7: |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
171 sh->fps = 59.94f; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
172 break; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
173 case 8: |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
174 sh->fps = 60.0f; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
175 break; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
176 default: |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
177 sh->fps = 25.0f; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
178 } |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
179 } |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
180 sh->frametime = 1.0f/sh->fps; |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
181 } |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
182 else |
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 y4m_init_stream_info(priv->si); |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
185 if ((err=y4m_read_stream_header(demuxer->stream, priv->si)) != Y4M_OK) |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
186 mp_msg(MSGT_DEMUXER, MSGL_FATAL, "error parsing YUV4MPEG header: %s\n", y4m_strerr(err)); |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
187 |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
188 if(!sh->fps) { |
3800 | 189 ratio = y4m_si_get_framerate(priv->si); |
190 if (ratio.d != 0) | |
191 sh->fps=(float)ratio.n/(float)ratio.d; | |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
192 else |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
193 sh->fps=15.0f; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
194 } |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
195 sh->frametime=1.0f/sh->fps; |
3800 | 196 |
197 ratio = y4m_si_get_sampleaspect(priv->si); | |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
198 |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
199 sh->disp_w = y4m_si_get_width(priv->si); |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
200 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
|
201 |
74968e3440ff
fix bug reported by Leonardo Giordani: sh->aspect is not pixel aspect but movie aspect
rik
parents:
9654
diff
changeset
|
202 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
|
203 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
|
204 |
3863 | 205 demuxer->seekable = 0; |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
206 } |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
207 |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
208 sh->format = mmioFOURCC('Y', 'V', '1', '2'); |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
209 |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
210 sh->bih=malloc(sizeof(BITMAPINFOHEADER)); |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
211 memset(sh->bih,0,sizeof(BITMAPINFOHEADER)); |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
212 sh->bih->biSize=40; |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
213 sh->bih->biWidth = sh->disp_w; |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
214 sh->bih->biHeight = sh->disp_h; |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
215 sh->bih->biPlanes=3; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
216 sh->bih->biBitCount=12; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
217 sh->bih->biCompression=sh->format; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
218 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
|
219 |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
220 demuxer->video->sh=sh; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
221 sh->ds=demuxer->video; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
222 demuxer->video->id=0; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
223 |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
224 |
3863 | 225 mp_msg(MSGT_DEMUX, MSGL_INFO, "YUV4MPEG2 Video stream %d size: display: %dx%d, codec: %ux%u\n", |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
226 demuxer->video->id, sh->disp_w, sh->disp_h, sh->bih->biWidth, |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
227 sh->bih->biHeight); |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
228 } |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
229 |
3863 | 230 int demux_seek_y4m(demuxer_t *demuxer, float rel_seek_secs, int flags) { |
231 sh_video_t* sh = demuxer->video->sh; | |
232 y4m_priv_t* priv = demuxer->priv; | |
233 int rel_seek_frames = sh->fps*rel_seek_secs; | |
234 int size = 3*sh->disp_w*sh->disp_h/2; | |
235 off_t curr_pos = stream_tell(demuxer->stream); | |
236 | |
237 if (priv->framenum + rel_seek_frames < 0) rel_seek_frames = -priv->framenum; | |
238 | |
239 //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)); | |
240 //printf("framenum=%d, curr_pos=%ld, currpos/(size+6)=%f\n", priv->framenum, curr_pos, (float)curr_pos/(float)(size+6)); | |
241 priv->framenum += rel_seek_frames; | |
242 | |
243 if (priv->is_older) { | |
244 /* Well this is easy: every frame takes up size+6 bytes | |
245 * in the stream and we may assume that the stream pointer | |
246 * is always at the beginning of a frame. | |
247 * framenum is the number of the frame that is about to be | |
248 * demuxed (counting from ONE (see demux_open_y4m)) */ | |
249 stream_seek(demuxer->stream, curr_pos + rel_seek_frames*(size+6)); | |
250 } else { | |
251 /* should never come here, because seeking for YUV4MPEG2 | |
252 * is disabled. */ | |
253 mp_msg(MSGT_DEMUX, MSGL_WARN, "Seeking for YUV4MPEG2 not yet implemented!\n"); | |
254 } | |
255 return 0; | |
256 } | |
257 | |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
258 void demux_close_y4m(demuxer_t *demuxer) |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
259 { |
3800 | 260 y4m_priv_t* priv = demuxer->priv; |
5810 | 261 |
262 if(!priv) | |
263 return; | |
3789
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
264 if (!priv->is_older) |
811b2e1ff030
added support for older YUV4MPEG format (used by xawtv)
alex
parents:
3786
diff
changeset
|
265 y4m_fini_stream_info(((y4m_priv_t*)demuxer->priv)->si); |
3786
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
266 free(((y4m_priv_t*)demuxer->priv)->si); |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
267 free(demuxer->priv); |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
268 return; |
7ebf504c92d6
yuv4mpeg2 (mjpegtools) support by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
269 } |