11 #include "stream/stream.h"
15 #include "libmpcodecs/img_format.h"
17 static int format
= IMGFMT_I420
;
18 static int size_id
= 0;
20 static int height
= 0;
21 static float fps
= 25;
24 const m_option_t demux_rawvideo_opts
[] = {
26 { "w", &width
, CONF_TYPE_INT
,CONF_RANGE
,1,8192, NULL
},
27 { "h", &height
, CONF_TYPE_INT
,CONF_RANGE
,1,8192, NULL
},
28 { "sqcif", &size_id
, CONF_TYPE_FLAG
,0,0,1, NULL
},
29 { "qcif", &size_id
, CONF_TYPE_FLAG
,0,0,2, NULL
},
30 { "cif", &size_id
, CONF_TYPE_FLAG
,0,0,3, NULL
},
31 { "4cif", &size_id
, CONF_TYPE_FLAG
,0,0,4, NULL
},
32 { "pal", &size_id
, CONF_TYPE_FLAG
,0,0,5, NULL
},
33 { "ntsc", &size_id
, CONF_TYPE_FLAG
,0,0,6, NULL
},
34 { "16cif", &size_id
, CONF_TYPE_FLAG
,0,0,7, NULL
},
35 { "sif", &size_id
, CONF_TYPE_FLAG
,0,0,8, NULL
},
37 { "format", &format
, CONF_TYPE_IMGFMT
, 0, 0 , 0, NULL
},
38 // below options are obsolete
39 { "i420", &format
, CONF_TYPE_FLAG
, 0, 0 , IMGFMT_I420
, NULL
},
40 { "yv12", &format
, CONF_TYPE_FLAG
, 0, 0 , IMGFMT_YV12
, NULL
},
41 { "nv12", &format
, CONF_TYPE_FLAG
, 0, 0 , IMGFMT_NV12
, NULL
},
42 { "hm12", &format
, CONF_TYPE_FLAG
, 0, 0 , IMGFMT_HM12
, NULL
},
43 { "yuy2", &format
, CONF_TYPE_FLAG
, 0, 0 , IMGFMT_YUY2
, NULL
},
44 { "uyvy", &format
, CONF_TYPE_FLAG
, 0, 0 , IMGFMT_UYVY
, NULL
},
45 { "y8", &format
, CONF_TYPE_FLAG
, 0, 0 , IMGFMT_Y8
, NULL
},
47 { "fps", &fps
, CONF_TYPE_FLOAT
,CONF_RANGE
,0.001,1000, NULL
},
48 { "size", &imgsize
, CONF_TYPE_INT
, CONF_RANGE
, 1 , 8192*8192*4, NULL
},
50 {NULL
, NULL
, 0, 0, 0, 0, NULL
}
54 static demuxer_t
* demux_rawvideo_open(demuxer_t
* demuxer
) {
58 case 1: width
=128; height
=96; break;
59 case 2: width
=176; height
=144; break;
60 case 3: width
=352; height
=288; break;
61 case 4: width
=704; height
=576; break;
62 case 5: width
=720; height
=576; break;
63 case 6: width
=720; height
=480; break;
64 case 7: width
=1408;height
=1152;break;
65 case 8: width
=352; height
=240; break;
67 if(!width
|| !height
){
68 mp_msg(MSGT_DEMUX
,MSGL_ERR
,"rawvideo: width or height not specified!\n");
78 case IMGFMT_YV12
: imgsize
=width
*height
+2*(width
>>1)*(height
>>1);break;
80 case IMGFMT_UYVY
: imgsize
=width
*height
*2;break;
82 case IMGFMT_Y8
: imgsize
=width
*height
;break;
84 if (IMGFMT_IS_RGB(format
))
85 imgsize
= width
* height
* ((IMGFMT_RGB_DEPTH(format
) + 7) >> 3);
86 else if (IMGFMT_IS_BGR(format
))
87 imgsize
= width
* height
* ((IMGFMT_BGR_DEPTH(format
) + 7) >> 3);
89 mp_msg(MSGT_DEMUX
,MSGL_ERR
,"rawvideo: img size not specified and unknown format!\n");
94 sh_video
= new_sh_video(demuxer
,0);
95 sh_video
->format
=format
;
97 sh_video
->frametime
=1.0/fps
;
98 sh_video
->disp_w
=width
;
99 sh_video
->disp_h
=height
;
100 sh_video
->i_bps
=fps
*imgsize
;
102 demuxer
->movi_start
= demuxer
->stream
->start_pos
;
103 demuxer
->movi_end
= demuxer
->stream
->end_pos
;
105 demuxer
->video
->sh
= sh_video
;
106 sh_video
->ds
= demuxer
->video
;
111 static int demux_rawvideo_fill_buffer(demuxer_t
* demuxer
, demux_stream_t
*ds
) {
112 sh_video_t
* sh
= demuxer
->video
->sh
;
114 if(demuxer
->stream
->eof
) return 0;
115 if(ds
!=demuxer
->video
) return 0;
116 pos
= stream_tell(demuxer
->stream
);
117 ds_read_packet(ds
,demuxer
->stream
,imgsize
,(pos
/imgsize
)*sh
->frametime
,pos
,0x10);
121 static void demux_rawvideo_seek(demuxer_t
*demuxer
,float rel_seek_secs
,float audio_delay
,int flags
){
122 stream_t
* s
= demuxer
->stream
;
123 sh_video_t
* sh_video
= demuxer
->video
->sh
;
126 pos
= (flags
& SEEK_ABSOLUTE
) ? demuxer
->movi_start
: stream_tell(s
);
127 if(flags
& SEEK_FACTOR
)
128 pos
+= ((demuxer
->movi_end
- demuxer
->movi_start
)*rel_seek_secs
);
130 pos
+= (rel_seek_secs
*sh_video
->i_bps
);
132 if(demuxer
->movi_end
&& pos
> demuxer
->movi_end
) pos
= (demuxer
->movi_end
-imgsize
);
134 stream_seek(s
,pos
*imgsize
);
135 //sh_video->timer=pos * sh_video->frametime;
136 demuxer
->video
->pts
= pos
* sh_video
->frametime
;
137 // printf("demux_rawvideo: streamtell=%d\n",(int)stream_tell(demuxer->stream));
141 const demuxer_desc_t demuxer_desc_rawvideo
= {
147 DEMUXER_TYPE_RAWVIDEO
,
150 demux_rawvideo_fill_buffer
,