diff options
-rw-r--r-- | core/cfg-mplayer.h | 2 | ||||
-rw-r--r-- | core/codec-cfg.c | 85 | ||||
-rw-r--r-- | core/codec-cfg.h | 14 | ||||
-rw-r--r-- | core/defaultopts.c | 1 | ||||
-rw-r--r-- | demux/stheader.h | 1 | ||||
-rw-r--r-- | etc/codecs.conf | 12 | ||||
-rw-r--r-- | video/decode/dec_video.c | 6 | ||||
-rw-r--r-- | video/decode/vd.c | 83 | ||||
-rw-r--r-- | video/decode/vd.h | 5 | ||||
-rw-r--r-- | video/decode/vd_lavc.c | 34 |
10 files changed, 34 insertions, 209 deletions
diff --git a/core/cfg-mplayer.h b/core/cfg-mplayer.h index a13eae243f..8ddf4616a0 100644 --- a/core/cfg-mplayer.h +++ b/core/cfg-mplayer.h @@ -480,7 +480,7 @@ const m_option_t common_opts[] = { OPT_FLAG_CONSTANTS("no-aspect", movie_aspect, 0, 0, 0), OPT_FLOATRANGE("xy", screen_size_xy, 0, 0.001, 4096), - OPT_FLAG_CONSTANTS("flip", flip, 0, -1, 1), + OPT_FLAG_CONSTANTS("flip", flip, 0, 0, 1), // use (probably completely broken) decoder direct rendering OPT_MAKE_FLAGS("dr1", vd_use_dr1, 0), diff --git a/core/codec-cfg.c b/core/codec-cfg.c index 91e56d6e25..ac875a8a82 100644 --- a/core/codec-cfg.c +++ b/core/codec-cfg.c @@ -138,71 +138,6 @@ static int add_to_format(char *s, char *alias,unsigned int *fourcc, unsigned int return 1; } -static int add_to_inout(char *sfmt, char *sflags, unsigned int *outfmt, - unsigned char *outflags) -{ - - static char *flagstr[] = { - "flip", - "noflip", - "yuvhack", - "query", - "static", - NULL - }; - - int i, j, freeslots; - unsigned char flags; - - for (i = 0; i < CODECS_MAX_OUTFMT && outfmt[i] != 0xffffffff; i++) - /* NOTHING */; - freeslots = CODECS_MAX_OUTFMT - i; - if (!freeslots) - goto err_out_too_many; - - flags = 0; - if(sflags) { - do { - for (j = 0; flagstr[j] != NULL; j++) - if (!strncmp(sflags, flagstr[j], - strlen(flagstr[j]))) - break; - if (flagstr[j] == NULL) - goto err_out_parse_error; - flags|=(1<<j); - sflags+=strlen(flagstr[j]); - } while (*(sflags++) == ','); - - if (*(--sflags) != '\0') - goto err_out_parse_error; - } - - do { - for (j = 0; isalnum(sfmt[j]) || sfmt[j] == '_'; j++); - unsigned int fmt = mp_imgfmt_from_name((bstr) {sfmt, j}, true); - if (!fmt) - goto err_out_parse_error; - outfmt[i] = fmt; - outflags[i] = flags; - ++i; - sfmt += j; - } while ((*(sfmt++) == ',') && --freeslots); - - if (!freeslots) - goto err_out_too_many; - - if (*(--sfmt) != '\0') - goto err_out_parse_error; - - return 1; -err_out_too_many: - mp_tmsg(MSGT_CODECCFG,MSGL_ERR,"too many out..."); - return 0; -err_out_parse_error: - mp_tmsg(MSGT_CODECCFG,MSGL_ERR,"parse error"); - return 0; -} - static int validate_codec(codecs_t *c, int type) { unsigned int i; @@ -422,8 +357,6 @@ int parse_codec_cfg(const char *cfgfile) ++*nr_codecsp; memset(codec,0,sizeof(codecs_t)); memset(codec->fourcc, 0xff, sizeof(codec->fourcc)); - memset(codec->outfmt, 0xff, sizeof(codec->outfmt)); - memset(codec->infmt, 0xff, sizeof(codec->infmt)); if (get_token(1, 1) < 0) goto err_out_parse_error; @@ -497,25 +430,11 @@ int parse_codec_cfg(const char *cfgfile) *endptr != '\0') goto err_out_parse_error; } - } else if (!strcmp(token[0], "out")) { - if (get_token(1, 2) < 0) - goto err_out_parse_error; - if (!add_to_inout(token[0], token[1], codec->outfmt, - codec->outflags)) - goto err_out_print_linenum; - } else if (!strcmp(token[0], "in")) { - if (get_token(1, 2) < 0) - goto err_out_parse_error; - if (!add_to_inout(token[0], token[1], codec->infmt, - codec->inflags)) - goto err_out_print_linenum; } else if (!strcmp(token[0], "flags")) { if (get_token(1, 1) < 0) goto err_out_parse_error; - if (!strcmp(token[0], "seekable")) - codec->flags |= CODECS_FLAG_SEEKABLE; - else if (!strcmp(token[0], "align16")) - codec->flags |= CODECS_FLAG_ALIGN16; + if (!strcmp(token[0], "flip")) + codec->flags |= CODECS_FLAG_FLIP; else goto err_out_parse_error; } else if (!strcmp(token[0], "status")) { diff --git a/core/codec-cfg.h b/core/codec-cfg.h index 480f570bba..01af497c3d 100644 --- a/core/codec-cfg.h +++ b/core/codec-cfg.h @@ -22,19 +22,9 @@ #include <stdbool.h> #define CODECS_MAX_FOURCC 92 -#define CODECS_MAX_OUTFMT 16 -#define CODECS_MAX_INFMT 16 // Global flags: -#define CODECS_FLAG_SEEKABLE (1<<0) -#define CODECS_FLAG_ALIGN16 (1<<1) - -// Outfmt flags: #define CODECS_FLAG_FLIP (1<<0) -#define CODECS_FLAG_NOFLIP (1<<1) -#define CODECS_FLAG_YUVHACK (1<<2) -#define CODECS_FLAG_QUERY (1<<3) -#define CODECS_FLAG_STATIC (1<<4) #define CODECS_STATUS__MIN 0 #define CODECS_STATUS_NOT_WORKING -1 @@ -59,10 +49,6 @@ typedef struct { typedef struct codecs { unsigned int fourcc[CODECS_MAX_FOURCC]; unsigned int fourccmap[CODECS_MAX_FOURCC]; - unsigned int outfmt[CODECS_MAX_OUTFMT]; - unsigned char outflags[CODECS_MAX_OUTFMT]; - unsigned int infmt[CODECS_MAX_INFMT]; - unsigned char inflags[CODECS_MAX_INFMT]; char *name; char *info; char *comment; diff --git a/core/defaultopts.c b/core/defaultopts.c index 4338e10b0a..a7da8bb4e3 100644 --- a/core/defaultopts.c +++ b/core/defaultopts.c @@ -52,7 +52,6 @@ void set_default_mplayer_options(struct MPOpts *opts) .playback_speed = 1., .drc_level = 1., .movie_aspect = -1., - .flip = -1, .sub_auto = 1, #ifdef CONFIG_ASS .ass_enabled = 1, diff --git a/demux/stheader.h b/demux/stheader.h index efcec02d7b..4745e452d5 100644 --- a/demux/stheader.h +++ b/demux/stheader.h @@ -156,7 +156,6 @@ typedef struct sh_video { int color_range; // mp_csp_levels // output driver/filters: (set by libmpcodecs core) unsigned int outfmt; - unsigned int outfmtidx; struct vf_instance *vfilter; // video filter chain int output_flags; // query_format() results for output filters+vo const struct vd_functions *vd_driver; diff --git a/etc/codecs.conf b/etc/codecs.conf index 2d3d3cefdc..7fb7b0fca6 100644 --- a/etc/codecs.conf +++ b/etc/codecs.conf @@ -209,8 +209,6 @@ videocodec ffmpeg12vdpau fourcc m2v1,m1v1 driver ffmpeg dll "mpegvideo_vdpau" - out VDPAU_MPEG1 - out VDPAU_MPEG2 videocodec ffmpeg2crystalhd info "FFmpeg MPEG-2 (CrystalHD)" @@ -307,7 +305,6 @@ videocodec mpng fourcc "png " ; for PNG-encoded QuickTime files dll "libpng" driver mpng - out BGR32,BGR24,BGR8,Y800 videocodec ffptx info "FFmpeg V.Flash PTX" @@ -647,7 +644,6 @@ videocodec ffwmv3vdpau fourcc WMV3,wmv3 driver ffmpeg dll wmv3_vdpau - out VDPAU_WMV3 videocodec ffwmv3crystalhd info "FFmpeg WMV3/WMV9 (CrystalHD)" @@ -671,7 +667,6 @@ videocodec ffvc1vdpau fourcc vc-1,VC-1 driver ffmpeg dll vc1_vdpau - out VDPAU_VC1 videocodec ffvc1crystalhd info "FFmpeg WVC1 (CrystalHD)" @@ -708,7 +703,6 @@ videocodec ffh264vdpau format 0x10000005 driver ffmpeg dll h264_vdpau - out VDPAU_H264 videocodec ffh264crystalhd info "FFmpeg H.264 (CrystalHD)" @@ -738,7 +732,6 @@ videocodec ffh264vda format 0x10000005 driver ffmpeg dll h264_vda - out YUY2,UYVY,YV12,NV12 videocodec ffsvq3 info "FFmpeg Sorenson Video v3 (SVQ3)" @@ -810,7 +803,6 @@ videocodec ffodivxvdpau fourcc SIPP ; Samsung SHR-6040 driver ffmpeg dll mpeg4_vdpau - out VDPAU_MPEG4 videocodec ffodivxcrystalhd info "FFmpeg MPEG-4,DIVX-4/5 (CrystalHD)" @@ -850,7 +842,7 @@ videocodec ffwv1f fourcc WV1F driver ffmpeg dll mpeg4 - out YV12,I420,IYUV flip + flags flip videocodec fflibschroedinger info "Dirac (through FFmpeg libschroedinger)" @@ -946,7 +938,7 @@ videocodec ffzygo fourcc ZyGo driver ffmpeg dll h263 - out YV12,I420,IYUV flip + flags flip videocodec ffh261 info "CCITT H.261" diff --git a/video/decode/dec_video.c b/video/decode/dec_video.c index 5c6cfc96ce..9ec5e3db65 100644 --- a/video/decode/dec_video.c +++ b/video/decode/dec_video.c @@ -252,12 +252,6 @@ static int init_video(sh_video_t *sh_video, char *codecname, char *vfm, orig_h = sh_video->bih ? sh_video->bih->biHeight : sh_video->disp_h; sh_video->disp_w = orig_w; sh_video->disp_h = orig_h; - // it's available, let's try to init! - if (sh_video->codec->flags & CODECS_FLAG_ALIGN16) { - // align width/height to n*16 - sh_video->disp_w = (sh_video->disp_w + 15) & (~15); - sh_video->disp_h = (sh_video->disp_h + 15) & (~15); - } if (sh_video->bih) { sh_video->bih->biWidth = sh_video->disp_w; sh_video->bih->biHeight = sh_video->disp_h; diff --git a/video/decode/vd.c b/video/decode/vd.c index 89783da189..2ed553d440 100644 --- a/video/decode/vd.c +++ b/video/decode/vd.c @@ -16,9 +16,10 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include <stdio.h> +#include <stdbool.h> #include <stdlib.h> #include <string.h> +#include <assert.h> #include "config.h" #include "core/mp_msg.h" @@ -51,13 +52,9 @@ const vd_functions_t * const mpcodecs_vd_drivers[] = { NULL }; -int mpcodecs_config_vo(sh_video_t *sh, int w, int h, - const unsigned int *outfmts, - unsigned int preferred_outfmt) +int mpcodecs_config_vo(sh_video_t *sh, int w, int h, unsigned int out_fmt) { struct MPOpts *opts = sh->opts; - int j; - unsigned int out_fmt = 0; int screen_size_x = 0; int screen_size_y = 0; vf_instance_t *vf = sh->vfilter; @@ -76,61 +73,37 @@ int mpcodecs_config_vo(sh_video_t *sh, int w, int h, if (!sh->disp_w || !sh->disp_h) return 0; - mp_msg(MSGT_DECVIDEO, MSGL_V, - "VDec: vo config request - %d x %d (preferred colorspace: %s)\n", - w, h, vo_format_name(preferred_outfmt)); + mp_msg(MSGT_DECVIDEO, MSGL_V, "VDec: vo config request - %d x %d (%s)\n", + w, h, vo_format_name(out_fmt)); if (get_video_quality_max(sh) <= 0 && divx_quality) { // user wants postprocess but no pp filter yet: sh->vfilter = vf = vf_open_filter(opts, vf, "pp", NULL); } - if (!outfmts || sh->codec->outfmt[0] != 0xffffffff) - outfmts = sh->codec->outfmt; - // check if libvo and codec has common outfmt (no conversion): - csp_again: - - if (mp_msg_test(MSGT_DECVIDEO, MSGL_V)) { - mp_msg(MSGT_DECVIDEO, MSGL_V, "Trying filter chain:"); - for (vf_instance_t *f = vf; f; f = f->next) - mp_msg(MSGT_DECVIDEO, MSGL_V, " %s", f->info->name); - mp_msg(MSGT_DECVIDEO, MSGL_V, "\n"); - } + for (;;) { + if (mp_msg_test(MSGT_DECVIDEO, MSGL_V)) { + mp_msg(MSGT_DECVIDEO, MSGL_V, "Trying filter chain:"); + for (vf_instance_t *f = vf; f; f = f->next) + mp_msg(MSGT_DECVIDEO, MSGL_V, " %s", f->info->name); + mp_msg(MSGT_DECVIDEO, MSGL_V, "\n"); + } - j = -1; - for (int i = 0; i < CODECS_MAX_OUTFMT; i++) { - int flags; - out_fmt = outfmts[i]; - if (out_fmt == (unsigned int) 0xFFFFFFFF) - break; - flags = vf->query_format(vf, out_fmt); - mp_msg(MSGT_CPLAYER, MSGL_DBG2, - "vo_debug: query(%s) returned 0x%X (i=%d) \n", - vo_format_name(out_fmt), flags, i); + int flags = vf->query_format(vf, out_fmt); + mp_msg(MSGT_CPLAYER, MSGL_DBG2, "vo_debug: query(%s) returned 0x%X \n", + vo_format_name(out_fmt), flags); if ((flags & VFCAP_CSP_SUPPORTED_BY_HW) - || (flags & VFCAP_CSP_SUPPORTED && j < 0)) { - // check (query) if codec really support this outfmt... - sh->outfmtidx = j; // pass index to the control() function this way - if (sh->vd_driver->control(sh, VDCTRL_QUERY_FORMAT, &out_fmt) == - CONTROL_FALSE) { - mp_msg(MSGT_CPLAYER, MSGL_DBG2, - "vo_debug: codec query_format(%s) returned FALSE\n", - vo_format_name(out_fmt)); - continue; - } - j = i; + || (flags & VFCAP_CSP_SUPPORTED)) + { sh->output_flags = flags; - if (flags & VFCAP_CSP_SUPPORTED_BY_HW) - break; + break; } - } - if (j < 0) { // TODO: no match - we should use conversion... if (strcmp(vf->info->name, "scale")) { mp_tmsg(MSGT_DECVIDEO, MSGL_INFO, "Could not find matching colorspace - retrying with -vf scale...\n"); vf = vf_open_filter(opts, vf, "scale", NULL); - goto csp_again; + continue; } mp_tmsg(MSGT_CPLAYER, MSGL_WARN, "The selected video_out device is incompatible with this codec.\n"\ @@ -139,24 +112,18 @@ int mpcodecs_config_vo(sh_video_t *sh, int w, int h, sh->vf_initialized = -1; return 0; // failed } - out_fmt = outfmts[j]; sh->outfmt = out_fmt; - mp_msg(MSGT_CPLAYER, MSGL_V, "VDec: using %s as output csp (no %d)\n", - vo_format_name(out_fmt), j); - sh->outfmtidx = j; + mp_msg(MSGT_CPLAYER, MSGL_V, "VDec: using %s as output csp\n", + vo_format_name(out_fmt)); sh->vfilter = vf; // autodetect flipping - if (opts->flip == -1) { - opts->flip = 0; - if (sh->codec->outflags[j] & CODECS_FLAG_FLIP) - if (!(sh->codec->outflags[j] & CODECS_FLAG_NOFLIP)) - opts->flip = 1; - } - if (opts->flip && !(sh->output_flags & VFCAP_FLIP)) { + bool flip = !!opts->flip != !!(sh->codec->flags & CODECS_FLAG_FLIP); + if (flip && !(sh->output_flags & VFCAP_FLIP)) { // we need to flip, but no flipping filter avail. vf_add_before_vo(&vf, "flip", NULL); sh->vfilter = vf; + flip = false; } // time to do aspect ratio corrections... @@ -216,7 +183,7 @@ int mpcodecs_config_vo(sh_video_t *sh, int w, int h, vocfg_flags = (opts->fullscreen ? VOFLAG_FULLSCREEN : 0) | (opts->vidmode ? VOFLAG_MODESWITCHING : 0) - | (opts->flip ? VOFLAG_FLIPPING : 0); + | (flip ? VOFLAG_FLIPPING : 0); // Time to config libvo! mp_msg(MSGT_CPLAYER, MSGL_V, diff --git a/video/decode/vd.h b/video/decode/vd.h index 838e5ad123..7b53c62840 100644 --- a/video/decode/vd.h +++ b/video/decode/vd.h @@ -42,15 +42,12 @@ typedef struct vd_functions // NULL terminated array of all drivers extern const vd_functions_t *const mpcodecs_vd_drivers[]; -#define VDCTRL_QUERY_FORMAT 3 // test for availabilty of a format #define VDCTRL_RESYNC_STREAM 8 // reset decode state after seeking #define VDCTRL_QUERY_UNSEEN_FRAMES 9 // current decoder lag #define VDCTRL_RESET_ASPECT 10 // reinit filter/VO chain for new aspect ratio // callbacks: -int mpcodecs_config_vo(sh_video_t *sh, int w, int h, - const unsigned int *outfmts, - unsigned int preferred_outfmt); +int mpcodecs_config_vo(sh_video_t *sh, int w, int h, unsigned int outfmt); mp_image_t *mpcodecs_get_image(sh_video_t *sh, int mp_imgtype, int mp_imgflag, int w, int h); diff --git a/video/decode/vd_lavc.c b/video/decode/vd_lavc.c index 2f661dfdd1..41286141ab 100644 --- a/video/decode/vd_lavc.c +++ b/video/decode/vd_lavc.c @@ -408,23 +408,11 @@ static int init_vo(sh_video_t *sh, enum PixelFormat pix_fmt) sh->disp_h = height; ctx->pix_fmt = pix_fmt; ctx->best_csp = pixfmt2imgfmt(pix_fmt); - const unsigned int *supported_fmts; - if (ctx->best_csp == IMGFMT_YV12) - supported_fmts = (const unsigned int[]){ - IMGFMT_YV12, IMGFMT_I420, IMGFMT_IYUV, 0xffffffff - }; - else if (ctx->best_csp == IMGFMT_422P) - supported_fmts = (const unsigned int[]){ - IMGFMT_422P, IMGFMT_YV12, IMGFMT_I420, IMGFMT_IYUV, 0xffffffff - }; - else - supported_fmts = (const unsigned int[]){ctx->best_csp, 0xffffffff}; sh->colorspace = avcol_spc_to_mp_csp(avctx->colorspace); sh->color_range = avcol_range_to_mp_csp_levels(avctx->color_range); - if (!mpcodecs_config_vo(sh, sh->disp_w, sh->disp_h, supported_fmts, - ctx->best_csp)) + if (!mpcodecs_config_vo(sh, sh->disp_w, sh->disp_h, ctx->best_csp)) return -1; ctx->vo_initialized = 1; } @@ -726,6 +714,8 @@ static struct mp_image *decode(struct sh_video *sh, struct demux_packet *packet, if (!mpi->planes[0]) return NULL; + assert(mpi->imgfmt == pixfmt2imgfmt(avctx->pix_fmt)); + if (ctx->best_csp == IMGFMT_422P && mpi->chroma_y_shift == 1) { // we have 422p but user wants 420p mpi->stride[1] *= 2; @@ -777,24 +767,6 @@ static int control(sh_video_t *sh, int cmd, void *arg) vd_ffmpeg_ctx *ctx = sh->context; AVCodecContext *avctx = ctx->avctx; switch (cmd) { - case VDCTRL_QUERY_FORMAT: { - int format = (*((int *)arg)); - if (format == ctx->best_csp) - return CONTROL_TRUE; - // possible conversions: - switch (format) { - case IMGFMT_YV12: - case IMGFMT_IYUV: - case IMGFMT_I420: - // "converted" using pointer/stride modification - if (ctx->best_csp == IMGFMT_YV12) - return CONTROL_TRUE; // u/v swap - if (ctx->best_csp == IMGFMT_422P && !ctx->do_dr1) - return CONTROL_TRUE; // half stride - break; - } - return CONTROL_FALSE; - } case VDCTRL_RESYNC_STREAM: avcodec_flush_buffers(avctx); return CONTROL_TRUE; |