Mercurial > mplayer.hg
annotate libmpdemux/demux_rawvideo.c @ 16529:d320720fe74e
feel free to fix this as you see fit...
i want to be sure people will not take interest in this option and
look it up and try using it. just enough for those already know it
and still stubborn enough to use it.
author | ods15 |
---|---|
date | Mon, 19 Sep 2005 19:36:10 +0000 |
parents | 6b86089c2edd |
children | 22f576c02442 |
rev | line source |
---|---|
9065 | 1 |
2 #include "config.h" | |
3 | |
4 #include <stdlib.h> | |
5 #include <stdio.h> | |
6 #include <unistd.h> | |
7 #include <string.h> | |
8 | |
9708
a37708f0b574
on now set the demuxer type some we can use rawvideo with -audiofile
albeu
parents:
9068
diff
changeset
|
9 #include "../m_option.h" |
9065 | 10 |
11 #include "stream.h" | |
12 #include "demuxer.h" | |
13 #include "stheader.h" | |
14 | |
15 #include "../libmpcodecs/img_format.h" | |
16 | |
9708
a37708f0b574
on now set the demuxer type some we can use rawvideo with -audiofile
albeu
parents:
9068
diff
changeset
|
17 extern int demuxer_type; |
9065 | 18 static int format = IMGFMT_I420; |
19 static int size_id = 0; | |
20 static int width = 0; | |
21 static int height = 0; | |
22 static float fps = 25; | |
23 static int imgsize=0; | |
24 | |
10594
57bdcdb061d7
Removed the historic cfgparser and switched full to the new config parser (altought some macros still remain for compatibility). As a side effect 90% of the warning messages are gone from the core. Things should be cleaner now and less confusing for newbies.
alex
parents:
10305
diff
changeset
|
25 m_option_t demux_rawvideo_opts[] = { |
9708
a37708f0b574
on now set the demuxer type some we can use rawvideo with -audiofile
albeu
parents:
9068
diff
changeset
|
26 { "on", &demuxer_type, CONF_TYPE_FLAG, 0,0, DEMUXER_TYPE_RAWVIDEO, NULL }, |
9065 | 27 // size: |
28 { "w", &width, CONF_TYPE_INT,CONF_RANGE,1,8192, NULL }, | |
29 { "h", &height, CONF_TYPE_INT,CONF_RANGE,1,8192, NULL }, | |
30 { "sqcif", &size_id, CONF_TYPE_FLAG,0,0,1, NULL }, | |
31 { "qcif", &size_id, CONF_TYPE_FLAG,0,0,2, NULL }, | |
32 { "cif", &size_id, CONF_TYPE_FLAG,0,0,3, NULL }, | |
33 { "4cif", &size_id, CONF_TYPE_FLAG,0,0,4, NULL }, | |
34 { "pal", &size_id, CONF_TYPE_FLAG,0,0,5, NULL }, | |
35 { "ntsc", &size_id, CONF_TYPE_FLAG,0,0,6, NULL }, | |
9068 | 36 { "16cif", &size_id, CONF_TYPE_FLAG,0,0,7, NULL }, |
37 { "sif", &size_id, CONF_TYPE_FLAG,0,0,8, NULL }, | |
9065 | 38 // format: |
10599 | 39 { "format", &format, CONF_TYPE_IMGFMT, 0, 0 , 0, NULL }, |
40 // below options are obsolete | |
14166 | 41 { "i420", &format, CONF_TYPE_FLAG, 0, 0 , IMGFMT_I420, NULL }, |
9065 | 42 { "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
|
43 { "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
|
44 { "hm12", &format, CONF_TYPE_FLAG, 0, 0 , IMGFMT_HM12, NULL }, |
9065 | 45 { "yuy2", &format, CONF_TYPE_FLAG, 0, 0 , IMGFMT_YUY2, NULL }, |
9068 | 46 { "uyvy", &format, CONF_TYPE_FLAG, 0, 0 , IMGFMT_UYVY, NULL }, |
9065 | 47 { "y8", &format, CONF_TYPE_FLAG, 0, 0 , IMGFMT_Y8, NULL }, |
48 // misc: | |
49 { "fps", &fps, CONF_TYPE_FLOAT,CONF_RANGE,0.001,1000, NULL }, | |
50 { "size", &imgsize, CONF_TYPE_INT, CONF_RANGE, 1 , 8192*8192*4, NULL }, | |
51 | |
52 {NULL, NULL, 0, 0, 0, 0, NULL} | |
53 }; | |
54 | |
55 | |
16175 | 56 static demuxer_t* demux_rawvideo_open(demuxer_t* demuxer) { |
9065 | 57 sh_video_t* sh_video; |
58 | |
59 switch(size_id){ | |
60 case 1: width=128; height=96; break; | |
61 case 2: width=176; height=144; break; | |
62 case 3: width=352; height=288; break; | |
63 case 4: width=704; height=576; break; | |
64 case 5: width=720; height=576; break; | |
65 case 6: width=720; height=480; break; | |
9068 | 66 case 7: width=1408;height=1152;break; |
67 case 8: width=352; height=240; break; | |
9065 | 68 } |
69 if(!width || !height){ | |
70 mp_msg(MSGT_DEMUX,MSGL_ERR,"rawvideo: width or height not specified!\n"); | |
71 return 0; | |
72 } | |
9068 | 73 |
9065 | 74 if(!imgsize) |
75 switch(format){ | |
76 case IMGFMT_I420: | |
77 case IMGFMT_IYUV: | |
10305
3e40b8f879c8
HM12 & NV12 "decoder" (specially interleaved YUV formats, used by Hauppauge's PVR cards)
arpi
parents:
9708
diff
changeset
|
78 case IMGFMT_NV12: |
3e40b8f879c8
HM12 & NV12 "decoder" (specially interleaved YUV formats, used by Hauppauge's PVR cards)
arpi
parents:
9708
diff
changeset
|
79 case IMGFMT_HM12: |
9065 | 80 case IMGFMT_YV12: imgsize=width*height+2*(width>>1)*(height>>1);break; |
81 case IMGFMT_YUY2: imgsize=width*height*2;break; | |
9068 | 82 case IMGFMT_UYVY: imgsize=width*height*2;break; |
9065 | 83 case IMGFMT_Y8: imgsize=width*height;break; |
84 default: | |
85 mp_msg(MSGT_DEMUX,MSGL_ERR,"rawvideo: img size not specified and unknown format!\n"); | |
86 return 0; | |
87 } | |
88 | |
89 sh_video = new_sh_video(demuxer,0); | |
90 sh_video->format=format; | |
91 sh_video->fps=fps; | |
92 sh_video->frametime=1.0/fps; | |
93 sh_video->disp_w=width; | |
94 sh_video->disp_h=height; | |
95 sh_video->i_bps=fps*imgsize; | |
96 | |
97 demuxer->movi_start = demuxer->stream->start_pos; | |
98 demuxer->movi_end = demuxer->stream->end_pos; | |
99 | |
100 demuxer->video->sh = sh_video; | |
101 sh_video->ds = demuxer->video; | |
102 | |
16175 | 103 return demuxer; |
9065 | 104 } |
105 | |
16175 | 106 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
|
107 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
|
108 off_t pos; |
9065 | 109 if(demuxer->stream->eof) return 0; |
110 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
|
111 pos = stream_tell(demuxer->stream); |
a37708f0b574
on now set the demuxer type some we can use rawvideo with -audiofile
albeu
parents:
9068
diff
changeset
|
112 ds_read_packet(ds,demuxer->stream,imgsize,(pos/imgsize)*sh->frametime,pos,0x10); |
9065 | 113 return 1; |
114 } | |
115 | |
16175 | 116 static void demux_rawvideo_seek(demuxer_t *demuxer,float rel_seek_secs,int flags){ |
9065 | 117 stream_t* s = demuxer->stream; |
118 sh_video_t* sh_video = demuxer->video->sh; | |
119 off_t pos; | |
120 | |
121 pos = (flags & 1) ? demuxer->movi_start : stream_tell(s); | |
122 if(flags & 2) | |
123 pos += ((demuxer->movi_end - demuxer->movi_start)*rel_seek_secs); | |
124 else | |
125 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
|
126 if(pos < 0) pos = 0; |
a37708f0b574
on now set the demuxer type some we can use rawvideo with -audiofile
albeu
parents:
9068
diff
changeset
|
127 if(demuxer->movi_end && pos > demuxer->movi_end) pos = (demuxer->movi_end-imgsize); |
9065 | 128 pos/=imgsize; |
129 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
|
130 //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
|
131 demuxer->video->pts = pos * sh_video->frametime; |
9065 | 132 // printf("demux_rawvideo: streamtell=%d\n",(int)stream_tell(demuxer->stream)); |
133 } | |
16175 | 134 |
135 | |
136 demuxer_desc_t demuxer_desc_rawvideo = { | |
137 "Raw video demuxer", | |
138 "rawvideo", | |
139 "rawvideo", | |
140 "?", | |
141 "", | |
142 DEMUXER_TYPE_RAWVIDEO, | |
143 0, // no autodetect | |
144 NULL, | |
145 demux_rawvideo_fill_buffer, | |
146 demux_rawvideo_open, | |
147 NULL, | |
148 demux_rawvideo_seek, | |
149 NULL | |
150 }; |