Mercurial > mplayer.hg
annotate libmpdemux/demux_rawvideo.c @ 35221:93337793866d
Do range check before using the variable for array indexing.
The other way round makes little sense...
author | reimar |
---|---|
date | Wed, 31 Oct 2012 20:29:28 +0000 |
parents | a93891202051 |
children | f3c835ddce85 |
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" |
34174
a93891202051
Add missing mp_msg.h #includes, remove some unnecessary ones.
diego
parents:
29238
diff
changeset
|
27 #include "mp_msg.h" |
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 }; |