Mercurial > mplayer.hg
annotate libmpdemux/demux_rawvideo.c @ 29946:54bacf6a38ca
Update the SuperH VEU vidix driver with code that calls fsync() after each
frame to make sure the frame is flushed in case of deferred io.
Patch by Magnus Damm, damm opensource se
author | cehoyos |
---|---|
date | Thu, 10 Dec 2009 23:16:08 +0000 |
parents | d643e4643313 |
children | a93891202051 |
rev | line source |
---|---|
29238
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26378
diff
changeset
|
1 /* |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26378
diff
changeset
|
2 * This file is part of MPlayer. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26378
diff
changeset
|
3 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26378
diff
changeset
|
4 * MPlayer is free software; you can redistribute it and/or modify |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26378
diff
changeset
|
5 * 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:
26378
diff
changeset
|
6 * the Free Software Foundation; either version 2 of the License, or |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26378
diff
changeset
|
7 * (at your option) any later version. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26378
diff
changeset
|
8 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26378
diff
changeset
|
9 * MPlayer is distributed in the hope that it will be useful, |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26378
diff
changeset
|
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26378
diff
changeset
|
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26378
diff
changeset
|
12 * GNU General Public License for more details. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26378
diff
changeset
|
13 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26378
diff
changeset
|
14 * 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:
26378
diff
changeset
|
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26378
diff
changeset
|
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26378
diff
changeset
|
17 */ |
9065 | 18 |
19 #include "config.h" | |
20 | |
21 #include <stdlib.h> | |
22 #include <stdio.h> | |
23 #include <unistd.h> | |
24 #include <string.h> | |
25 | |
17012 | 26 #include "m_option.h" |
9065 | 27 |
22605
4d81dbdf46b9
Add explicit location for headers from the stream/ directory.
diego
parents:
17636
diff
changeset
|
28 #include "stream/stream.h" |
9065 | 29 #include "demuxer.h" |
30 #include "stheader.h" | |
31 | |
17012 | 32 #include "libmpcodecs/img_format.h" |
9065 | 33 |
34 static int format = IMGFMT_I420; | |
35 static int size_id = 0; | |
36 static int width = 0; | |
37 static int height = 0; | |
38 static float fps = 25; | |
39 static int imgsize=0; | |
40 | |
25241
bb7c65f2a289
Make m_option_t arrays referenced by cfg-common.h const
reimar
parents:
25193
diff
changeset
|
41 const m_option_t demux_rawvideo_opts[] = { |
9065 | 42 // size: |
43 { "w", &width, CONF_TYPE_INT,CONF_RANGE,1,8192, NULL }, | |
44 { "h", &height, CONF_TYPE_INT,CONF_RANGE,1,8192, NULL }, | |
45 { "sqcif", &size_id, CONF_TYPE_FLAG,0,0,1, NULL }, | |
46 { "qcif", &size_id, CONF_TYPE_FLAG,0,0,2, NULL }, | |
47 { "cif", &size_id, CONF_TYPE_FLAG,0,0,3, NULL }, | |
48 { "4cif", &size_id, CONF_TYPE_FLAG,0,0,4, NULL }, | |
49 { "pal", &size_id, CONF_TYPE_FLAG,0,0,5, NULL }, | |
50 { "ntsc", &size_id, CONF_TYPE_FLAG,0,0,6, NULL }, | |
9068 | 51 { "16cif", &size_id, CONF_TYPE_FLAG,0,0,7, NULL }, |
52 { "sif", &size_id, CONF_TYPE_FLAG,0,0,8, NULL }, | |
9065 | 53 // format: |
10599 | 54 { "format", &format, CONF_TYPE_IMGFMT, 0, 0 , 0, NULL }, |
55 // below options are obsolete | |
14166 | 56 { "i420", &format, CONF_TYPE_FLAG, 0, 0 , IMGFMT_I420, NULL }, |
9065 | 57 { "yv12", &format, CONF_TYPE_FLAG, 0, 0 , IMGFMT_YV12, NULL }, |
10305
3e40b8f879c8
HM12 & NV12 "decoder" (specially interleaved YUV formats, used by Hauppauge's PVR cards)
arpi
parents:
9708
diff
changeset
|
58 { "nv12", &format, CONF_TYPE_FLAG, 0, 0 , IMGFMT_NV12, NULL }, |
3e40b8f879c8
HM12 & NV12 "decoder" (specially interleaved YUV formats, used by Hauppauge's PVR cards)
arpi
parents:
9708
diff
changeset
|
59 { "hm12", &format, CONF_TYPE_FLAG, 0, 0 , IMGFMT_HM12, NULL }, |
9065 | 60 { "yuy2", &format, CONF_TYPE_FLAG, 0, 0 , IMGFMT_YUY2, NULL }, |
9068 | 61 { "uyvy", &format, CONF_TYPE_FLAG, 0, 0 , IMGFMT_UYVY, NULL }, |
9065 | 62 { "y8", &format, CONF_TYPE_FLAG, 0, 0 , IMGFMT_Y8, NULL }, |
63 // misc: | |
64 { "fps", &fps, CONF_TYPE_FLOAT,CONF_RANGE,0.001,1000, NULL }, | |
65 { "size", &imgsize, CONF_TYPE_INT, CONF_RANGE, 1 , 8192*8192*4, NULL }, | |
66 | |
67 {NULL, NULL, 0, 0, 0, 0, NULL} | |
68 }; | |
69 | |
70 | |
16175 | 71 static demuxer_t* demux_rawvideo_open(demuxer_t* demuxer) { |
9065 | 72 sh_video_t* sh_video; |
73 | |
74 switch(size_id){ | |
75 case 1: width=128; height=96; break; | |
76 case 2: width=176; height=144; break; | |
77 case 3: width=352; height=288; break; | |
78 case 4: width=704; height=576; break; | |
79 case 5: width=720; height=576; break; | |
80 case 6: width=720; height=480; break; | |
9068 | 81 case 7: width=1408;height=1152;break; |
82 case 8: width=352; height=240; break; | |
9065 | 83 } |
84 if(!width || !height){ | |
85 mp_msg(MSGT_DEMUX,MSGL_ERR,"rawvideo: width or height not specified!\n"); | |
86 return 0; | |
87 } | |
9068 | 88 |
9065 | 89 if(!imgsize) |
90 switch(format){ | |
91 case IMGFMT_I420: | |
92 case IMGFMT_IYUV: | |
10305
3e40b8f879c8
HM12 & NV12 "decoder" (specially interleaved YUV formats, used by Hauppauge's PVR cards)
arpi
parents:
9708
diff
changeset
|
93 case IMGFMT_NV12: |
3e40b8f879c8
HM12 & NV12 "decoder" (specially interleaved YUV formats, used by Hauppauge's PVR cards)
arpi
parents:
9708
diff
changeset
|
94 case IMGFMT_HM12: |
9065 | 95 case IMGFMT_YV12: imgsize=width*height+2*(width>>1)*(height>>1);break; |
25193 | 96 case IMGFMT_YUY2: |
9068 | 97 case IMGFMT_UYVY: imgsize=width*height*2;break; |
24740 | 98 case IMGFMT_Y800: |
9065 | 99 case IMGFMT_Y8: imgsize=width*height;break; |
100 default: | |
17219 | 101 if (IMGFMT_IS_RGB(format)) |
102 imgsize = width * height * ((IMGFMT_RGB_DEPTH(format) + 7) >> 3); | |
103 else if (IMGFMT_IS_BGR(format)) | |
104 imgsize = width * height * ((IMGFMT_BGR_DEPTH(format) + 7) >> 3); | |
105 else { | |
9065 | 106 mp_msg(MSGT_DEMUX,MSGL_ERR,"rawvideo: img size not specified and unknown format!\n"); |
107 return 0; | |
17219 | 108 } |
9065 | 109 } |
110 | |
111 sh_video = new_sh_video(demuxer,0); | |
112 sh_video->format=format; | |
113 sh_video->fps=fps; | |
114 sh_video->frametime=1.0/fps; | |
115 sh_video->disp_w=width; | |
116 sh_video->disp_h=height; | |
117 sh_video->i_bps=fps*imgsize; | |
118 | |
119 demuxer->movi_start = demuxer->stream->start_pos; | |
120 demuxer->movi_end = demuxer->stream->end_pos; | |
121 | |
122 demuxer->video->sh = sh_video; | |
123 sh_video->ds = demuxer->video; | |
124 | |
16175 | 125 return demuxer; |
9065 | 126 } |
127 | |
16175 | 128 static int demux_rawvideo_fill_buffer(demuxer_t* demuxer, demux_stream_t *ds) { |
9708
a37708f0b574
on now set the demuxer type some we can use rawvideo with -audiofile
albeu
parents:
9068
diff
changeset
|
129 sh_video_t* sh = demuxer->video->sh; |
a37708f0b574
on now set the demuxer type some we can use rawvideo with -audiofile
albeu
parents:
9068
diff
changeset
|
130 off_t pos; |
9065 | 131 if(demuxer->stream->eof) return 0; |
132 if(ds!=demuxer->video) return 0; | |
9708
a37708f0b574
on now set the demuxer type some we can use rawvideo with -audiofile
albeu
parents:
9068
diff
changeset
|
133 pos = stream_tell(demuxer->stream); |
a37708f0b574
on now set the demuxer type some we can use rawvideo with -audiofile
albeu
parents:
9068
diff
changeset
|
134 ds_read_packet(ds,demuxer->stream,imgsize,(pos/imgsize)*sh->frametime,pos,0x10); |
9065 | 135 return 1; |
136 } | |
137 | |
17636 | 138 static void demux_rawvideo_seek(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags){ |
9065 | 139 stream_t* s = demuxer->stream; |
140 sh_video_t* sh_video = demuxer->video->sh; | |
141 off_t pos; | |
142 | |
25883
baf32110d3fc
Use defines to give names to the different seek flags.
reimar
parents:
25707
diff
changeset
|
143 pos = (flags & SEEK_ABSOLUTE) ? demuxer->movi_start : stream_tell(s); |
baf32110d3fc
Use defines to give names to the different seek flags.
reimar
parents:
25707
diff
changeset
|
144 if(flags & SEEK_FACTOR) |
9065 | 145 pos += ((demuxer->movi_end - demuxer->movi_start)*rel_seek_secs); |
146 else | |
147 pos += (rel_seek_secs*sh_video->i_bps); | |
9708
a37708f0b574
on now set the demuxer type some we can use rawvideo with -audiofile
albeu
parents:
9068
diff
changeset
|
148 if(pos < 0) pos = 0; |
a37708f0b574
on now set the demuxer type some we can use rawvideo with -audiofile
albeu
parents:
9068
diff
changeset
|
149 if(demuxer->movi_end && pos > demuxer->movi_end) pos = (demuxer->movi_end-imgsize); |
9065 | 150 pos/=imgsize; |
151 stream_seek(s,pos*imgsize); | |
9708
a37708f0b574
on now set the demuxer type some we can use rawvideo with -audiofile
albeu
parents:
9068
diff
changeset
|
152 //sh_video->timer=pos * sh_video->frametime; |
a37708f0b574
on now set the demuxer type some we can use rawvideo with -audiofile
albeu
parents:
9068
diff
changeset
|
153 demuxer->video->pts = pos * sh_video->frametime; |
9065 | 154 // printf("demux_rawvideo: streamtell=%d\n",(int)stream_tell(demuxer->stream)); |
155 } | |
16175 | 156 |
157 | |
25707
d4fe6e23283e
Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents:
25241
diff
changeset
|
158 const demuxer_desc_t demuxer_desc_rawvideo = { |
16175 | 159 "Raw video demuxer", |
160 "rawvideo", | |
161 "rawvideo", | |
162 "?", | |
163 "", | |
164 DEMUXER_TYPE_RAWVIDEO, | |
165 0, // no autodetect | |
166 NULL, | |
167 demux_rawvideo_fill_buffer, | |
168 demux_rawvideo_open, | |
169 NULL, | |
170 demux_rawvideo_seek, | |
171 NULL | |
172 }; |