2 * This file is part of MPlayer.
4 * MPlayer is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * MPlayer is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License along
15 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
30 #include "vd_internal.h"
32 #include "loader/dmo/DMO_VideoDecoder.h"
34 static const vd_info_t info
= {
38 "based on http://avifile.sf.net",
50 // to set/get/query special features/parameters
51 static int control(sh_video_t
*sh
,int cmd
,void* arg
,...){
52 return CONTROL_UNKNOWN
;
56 static int init(sh_video_t
*sh
){
57 unsigned int out_fmt
=sh
->codec
->outfmt
[0];
60 if(!(decoder
=DMO_VideoDecoder_Open(sh
->codec
->dll
,&sh
->codec
->guid
, sh
->bih
, 0, 0))){
61 mp_tmsg(MSGT_DECVIDEO
,MSGL_ERR
,"ERROR: Could not open required DirectShow codec %s.\n",sh
->codec
->dll
);
62 mp_tmsg(MSGT_DECVIDEO
,MSGL_HINT
,"You need to upgrade/install the binary codecs package.\nGo to http://www.mplayerhq.hu/dload.html\n");
65 if(!mpcodecs_config_vo(sh
,sh
->disp_w
,sh
->disp_h
,out_fmt
)) return 0;
66 // mpcodecs_config_vo can change the format
67 out_fmt
=sh
->codec
->outfmt
[sh
->outfmtidx
];
68 sh
->context
= ctx
= calloc(1, sizeof(*ctx
));
69 ctx
->decoder
= decoder
;
73 DMO_VideoDecoder_SetDestFmt(ctx
->decoder
,16,out_fmt
);break; // packed YUV
77 DMO_VideoDecoder_SetDestFmt(ctx
->decoder
,12,out_fmt
);break; // planar YUV
79 DMO_VideoDecoder_SetDestFmt(ctx
->decoder
,9,out_fmt
);break;
84 ctx
->stride
= ((sh
->disp_w
* 3) + 3) & ~3;
85 ctx
->buffer
= av_malloc(ctx
->stride
* sh
->disp_h
);
88 DMO_VideoDecoder_SetDestFmt(ctx
->decoder
,out_fmt
&255,0); // RGB/BGR
90 DMO_VideoDecoder_StartInternal(ctx
->decoder
);
91 mp_tmsg(MSGT_DECVIDEO
,MSGL_V
,"INFO: Win32/DMO video codec init OK.\n");
96 static void uninit(sh_video_t
*sh
){
97 struct context
*ctx
= sh
->context
;
98 DMO_VideoDecoder_Destroy(ctx
->decoder
);
104 //mp_image_t* mpcodecs_get_image(sh_video_t *sh, int mp_imgtype, int mp_imgflag, int w, int h);
107 static mp_image_t
* decode(sh_video_t
*sh
,void* data
,int len
,int flags
){
108 struct context
*ctx
= sh
->context
;
109 uint8_t *buffer
= ctx
->buffer
;
110 int type
= ctx
->buffer
? MP_IMGTYPE_EXPORT
: MP_IMGTYPE_TEMP
;
112 if(len
<=0) return NULL
; // skipped frame
116 DMO_VideoDecoder_DecodeInternal(ctx
->decoder
, data
, len
, 0, 0);
120 mpi
=mpcodecs_get_image(sh
, type
, MP_IMGFLAG_COMMON_PLANE
,
121 sh
->disp_w
, sh
->disp_h
);
123 mpi
->planes
[0] = buffer
;
124 mpi
->stride
[0] = ctx
->stride
;
126 buffer
= mpi
->planes
[0];
129 if(!mpi
){ // temporary!
130 mp_tmsg(MSGT_DECVIDEO
,MSGL_WARN
,"[VD_DMO] Couldn't allocate image for cinepak codec.\n");
134 DMO_VideoDecoder_DecodeInternal(ctx
->decoder
, data
, len
, 1, buffer
);