diff options
Diffstat (limited to 'demux')
-rw-r--r-- | demux/demux_mng.c | 5 | ||||
-rw-r--r-- | demux/demux_rawvideo.c | 81 | ||||
-rw-r--r-- | demux/stheader.h | 1 |
3 files changed, 56 insertions, 31 deletions
diff --git a/demux/demux_mng.c b/demux/demux_mng.c index 1d21d9d218..74f633d64e 100644 --- a/demux/demux_mng.c +++ b/demux/demux_mng.c @@ -31,7 +31,7 @@ #include "stream/stream.h" #include "demux.h" #include "stheader.h" -#include "video/img_format.h" +#include "video/img_fourcc.h" #define MNG_SUPPORT_READ #define MNG_SUPPORT_DISPLAY @@ -437,7 +437,8 @@ static demuxer_t * demux_mng_open(demuxer_t * demuxer) sh_video->ds = demuxer->video; // set format of pixels in video packets - sh_video->format = IMGFMT_RGB32; + sh_video->format = MP_FOURCC_RAWVIDEO; + sh_video->imgfmt = MP_FOURCC_RGB32; // set framerate to some value (MNG does not have a fixed framerate) sh_video->fps = 5.0f; diff --git a/demux/demux_rawvideo.c b/demux/demux_rawvideo.c index 68dc270e44..47d32f933e 100644 --- a/demux/demux_rawvideo.c +++ b/demux/demux_rawvideo.c @@ -30,8 +30,10 @@ #include "stheader.h" #include "video/img_format.h" +#include "video/img_fourcc.h" -static int format = IMGFMT_I420; +static int format = MP_FOURCC_I420; +static int mp_format; static int size_id = 0; static int width = 0; static int height = 0; @@ -51,15 +53,8 @@ const m_option_t demux_rawvideo_opts[] = { { "16cif", &size_id, CONF_TYPE_FLAG,0,0,7, NULL }, { "sif", &size_id, CONF_TYPE_FLAG,0,0,8, NULL }, // format: - { "format", &format, CONF_TYPE_IMGFMT, 0, 0 , 0, NULL }, - // below options are obsolete - { "i420", &format, CONF_TYPE_FLAG, 0, 0 , IMGFMT_I420, NULL }, - { "yv12", &format, CONF_TYPE_FLAG, 0, 0 , IMGFMT_YV12, NULL }, - { "nv12", &format, CONF_TYPE_FLAG, 0, 0 , IMGFMT_NV12, NULL }, - { "hm12", &format, CONF_TYPE_FLAG, 0, 0 , IMGFMT_HM12, NULL }, - { "yuy2", &format, CONF_TYPE_FLAG, 0, 0 , IMGFMT_YUY2, NULL }, - { "uyvy", &format, CONF_TYPE_FLAG, 0, 0 , IMGFMT_UYVY, NULL }, - { "y8", &format, CONF_TYPE_FLAG, 0, 0 , IMGFMT_Y8, NULL }, + { "format", &format, CONF_TYPE_FOURCC, 0, 0 , 0, NULL }, + { "mp-format", &mp_format, CONF_TYPE_IMGFMT, 0, 0 , 0, NULL }, // misc: { "fps", &fps, CONF_TYPE_FLOAT,CONF_RANGE,0.001,1000, NULL }, { "size", &imgsize, CONF_TYPE_INT, CONF_RANGE, 1 , 8192*8192*4, NULL }, @@ -86,30 +81,58 @@ static demuxer_t* demux_rawvideo_open(demuxer_t* demuxer) { return 0; } - if(!imgsize) - switch(format){ - case IMGFMT_I420: - case IMGFMT_IYUV: - case IMGFMT_NV12: - case IMGFMT_HM12: - case IMGFMT_YV12: imgsize=width*height+2*(width>>1)*(height>>1);break; - case IMGFMT_YUY2: - case IMGFMT_UYVY: imgsize=width*height*2;break; - case IMGFMT_Y800: - case IMGFMT_Y8: imgsize=width*height;break; - default: - if (IMGFMT_IS_RGB(format)) - imgsize = width * height * ((IMGFMT_RGB_DEPTH(format) + 7) >> 3); - else if (IMGFMT_IS_BGR(format)) - imgsize = width * height * ((IMGFMT_BGR_DEPTH(format) + 7) >> 3); - else { + int tag, fmt; + if (mp_format) { + tag = MP_FOURCC_IMGFMT; + fmt = mp_format; + if (!imgsize) { + struct mp_imgfmt_desc desc = mp_imgfmt_get_desc(mp_format); + for (int p = 0; p < desc.num_planes; p++) { + imgsize += ((width >> desc.xs[p]) * (height >> desc.ys[p]) * + desc.bpp[p] + 7) / 8; + } + } + } else { + tag = MP_FOURCC_RAWVIDEO; + fmt = format; + } + + if (!imgsize) { + int bpp = 0; + switch(format){ + case MP_FOURCC_I420: case MP_FOURCC_IYUV: + case MP_FOURCC_NV12: case MP_FOURCC_NV21: + case MP_FOURCC_HM12: + case MP_FOURCC_YV12: + bpp = 12; + break; + case MP_FOURCC_RGB12: case MP_FOURCC_BGR12: + case MP_FOURCC_RGB15: case MP_FOURCC_BGR15: + case MP_FOURCC_RGB16: case MP_FOURCC_BGR16: + case MP_FOURCC_YUY2: case MP_FOURCC_UYVY: + bpp = 16; + break; + case MP_FOURCC_RGB8: case MP_FOURCC_BGR8: + case MP_FOURCC_Y800: case MP_FOURCC_Y8: + bpp = 8; + break; + case MP_FOURCC_RGB24: case MP_FOURCC_BGR24: + bpp = 24; + break; + case MP_FOURCC_RGB32: case MP_FOURCC_BGR32: + bpp = 32; + break; + } + if (!bpp) { mp_msg(MSGT_DEMUX,MSGL_ERR,"rawvideo: img size not specified and unknown format!\n"); return 0; - } + } + imgsize = width * height * bpp / 8; } sh_video = new_sh_video(demuxer,0); - sh_video->format=format; + sh_video->format=tag; + sh_video->imgfmt=fmt; sh_video->fps=fps; sh_video->frametime=1.0/fps; sh_video->disp_w=width; diff --git a/demux/stheader.h b/demux/stheader.h index 4745e452d5..97d079f4e6 100644 --- a/demux/stheader.h +++ b/demux/stheader.h @@ -154,6 +154,7 @@ typedef struct sh_video { int disp_w, disp_h; // display size (filled by demuxer) int colorspace; // mp_csp int color_range; // mp_csp_levels + int imgfmt; // raw video image format // output driver/filters: (set by libmpcodecs core) unsigned int outfmt; struct vf_instance *vfilter; // video filter chain |