Mercurial > mplayer.hg
annotate libmpcodecs/vd_dmo.c @ 33306:37e215798390
Fix output of "No bind found for key" to actually make sense for
key combinations and match the binding you'd have to add to input.conf
also for these.
Previously the extra keys would end up appended at the end, resulting
in output like
> No bind found for key 'MOUSE_BTN0'.-MOUSE_BTN2
and even worse for some translations.
author | reimar |
---|---|
date | Sat, 07 May 2011 11:11:07 +0000 |
parents | 00825525514e |
children | 277ec491a8a7 |
rev | line source |
---|---|
30421
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
1 /* |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
2 * This file is part of MPlayer. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
3 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
4 * MPlayer is free software; you can redistribute it and/or modify |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
5 * it under the terms of the GNU General Public License as published by |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
6 * the Free Software Foundation; either version 2 of the License, or |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
7 * (at your option) any later version. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
8 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
9 * MPlayer is distributed in the hope that it will be useful, |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
12 * GNU General Public License for more details. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
13 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
14 * You should have received a copy of the GNU General Public License along |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
17 */ |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
18 |
30636
93379281129d
Add malloc.h #include for memalign(), fixes the warning:
diego
parents:
30606
diff
changeset
|
19 #include "config.h" |
93379281129d
Add malloc.h #include for memalign(), fixes the warning:
diego
parents:
30606
diff
changeset
|
20 |
93379281129d
Add malloc.h #include for memalign(), fixes the warning:
diego
parents:
30606
diff
changeset
|
21 #if HAVE_MALLOC_H |
93379281129d
Add malloc.h #include for memalign(), fixes the warning:
diego
parents:
30606
diff
changeset
|
22 #include <malloc.h> |
93379281129d
Add malloc.h #include for memalign(), fixes the warning:
diego
parents:
30606
diff
changeset
|
23 #endif |
8295 | 24 #include <stdio.h> |
25 #include <stdlib.h> | |
26 #include <stdarg.h> | |
27 | |
28 #include "mp_msg.h" | |
29 #include "help_mp.h" | |
30 | |
31 #include "vd_internal.h" | |
32 | |
33 #include "loader/dmo/DMO_VideoDecoder.h" | |
34 | |
30504
cc27da5d7286
Mark all ad_info_t/vd_info_t structure declarations as const.
diego
parents:
30421
diff
changeset
|
35 static const vd_info_t info = { |
8295 | 36 "DMO video codecs", |
37 "dmo", | |
38 "A'rpi", | |
39 "based on http://avifile.sf.net", | |
40 "win32 codecs" | |
41 }; | |
42 | |
43 LIBVD_EXTERN(dmo) | |
44 | |
30606
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
45 struct context { |
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
46 void *decoder; |
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
47 uint8_t *buffer; |
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
48 int stride; |
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
49 }; |
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
50 |
8295 | 51 // to set/get/query special features/parameters |
52 static int control(sh_video_t *sh,int cmd,void* arg,...){ | |
53 return CONTROL_UNKNOWN; | |
54 } | |
55 | |
56 // init driver | |
57 static int init(sh_video_t *sh){ | |
30782
1c38d10731ab
Partially revert r30645, the final output format is determined by
reimar
parents:
30636
diff
changeset
|
58 unsigned int out_fmt=sh->codec->outfmt[0]; |
30606
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
59 struct context *ctx; |
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
60 void *decoder; |
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
61 if(!(decoder=DMO_VideoDecoder_Open(sh->codec->dll,&sh->codec->guid, sh->bih, 0, 0))){ |
8295 | 62 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_MissingDLLcodec,sh->codec->dll); |
12763
f34a7cf4265a
Console message corrected and moved to help_mp-en.h.
diego
parents:
8504
diff
changeset
|
63 mp_msg(MSGT_DECVIDEO,MSGL_HINT,MSGTR_DownloadCodecPackage); |
8295 | 64 return 0; |
65 } | |
30603
c5d8b7640b7d
Call mpcodecs_config_vo with the proper image format for dmo and dshow codecs.
reimar
parents:
30504
diff
changeset
|
66 if(!mpcodecs_config_vo(sh,sh->disp_w,sh->disp_h,out_fmt)) return 0; |
30782
1c38d10731ab
Partially revert r30645, the final output format is determined by
reimar
parents:
30636
diff
changeset
|
67 // mpcodecs_config_vo can change the format |
1c38d10731ab
Partially revert r30645, the final output format is determined by
reimar
parents:
30636
diff
changeset
|
68 out_fmt=sh->codec->outfmt[sh->outfmtidx]; |
30606
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
69 sh->context = ctx = calloc(1, sizeof(*ctx)); |
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
70 ctx->decoder = decoder; |
8295 | 71 switch(out_fmt){ |
72 case IMGFMT_YUY2: | |
73 case IMGFMT_UYVY: | |
30606
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
74 DMO_VideoDecoder_SetDestFmt(ctx->decoder,16,out_fmt);break; // packed YUV |
8295 | 75 case IMGFMT_YV12: |
76 case IMGFMT_I420: | |
77 case IMGFMT_IYUV: | |
30606
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
78 DMO_VideoDecoder_SetDestFmt(ctx->decoder,12,out_fmt);break; // planar YUV |
8295 | 79 case IMGFMT_YVU9: |
30606
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
80 DMO_VideoDecoder_SetDestFmt(ctx->decoder,9,out_fmt);break; |
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
81 case IMGFMT_RGB24: |
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
82 case IMGFMT_BGR24: |
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
83 if (sh->disp_w & 3) |
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
84 { |
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
85 ctx->stride = ((sh->disp_w * 3) + 3) & ~3; |
31003
00825525514e
Replace memalign(x) (x > 8) by av_malloc() to prevent crashes on systems
zuxy
parents:
30782
diff
changeset
|
86 ctx->buffer = av_malloc(ctx->stride * sh->disp_h); |
30606
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
87 } |
8295 | 88 default: |
30606
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
89 DMO_VideoDecoder_SetDestFmt(ctx->decoder,out_fmt&255,0); // RGB/BGR |
8295 | 90 } |
30606
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
91 DMO_VideoDecoder_StartInternal(ctx->decoder); |
12763
f34a7cf4265a
Console message corrected and moved to help_mp-en.h.
diego
parents:
8504
diff
changeset
|
92 mp_msg(MSGT_DECVIDEO,MSGL_V,MSGTR_DMOInitOK); |
8295 | 93 return 1; |
94 } | |
95 | |
96 // uninit driver | |
97 static void uninit(sh_video_t *sh){ | |
30606
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
98 struct context *ctx = sh->context; |
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
99 DMO_VideoDecoder_Destroy(ctx->decoder); |
31003
00825525514e
Replace memalign(x) (x > 8) by av_malloc() to prevent crashes on systems
zuxy
parents:
30782
diff
changeset
|
100 av_free(ctx->buffer); |
30606
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
101 free(ctx); |
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
102 sh->context = NULL; |
8295 | 103 } |
104 | |
105 //mp_image_t* mpcodecs_get_image(sh_video_t *sh, int mp_imgtype, int mp_imgflag, int w, int h); | |
106 | |
107 // decode a frame | |
108 static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags){ | |
30606
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
109 struct context *ctx = sh->context; |
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
110 uint8_t *buffer = ctx->buffer; |
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
111 int type = ctx->buffer ? MP_IMGTYPE_EXPORT : MP_IMGTYPE_TEMP; |
8295 | 112 mp_image_t* mpi; |
113 if(len<=0) return NULL; // skipped frame | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
18765
diff
changeset
|
114 |
8295 | 115 if(flags&3){ |
116 // framedrop: | |
30606
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
117 DMO_VideoDecoder_DecodeInternal(ctx->decoder, data, len, 0, 0); |
8295 | 118 return NULL; |
119 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
18765
diff
changeset
|
120 |
30606
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
121 mpi=mpcodecs_get_image(sh, type, MP_IMGFLAG_COMMON_PLANE, |
8295 | 122 sh->disp_w, sh->disp_h); |
30606
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
123 if (buffer) { |
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
124 mpi->planes[0] = buffer; |
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
125 mpi->stride[0] = ctx->stride; |
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
126 } else { |
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
127 buffer = mpi->planes[0]; |
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
128 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
18765
diff
changeset
|
129 |
8295 | 130 if(!mpi){ // temporary! |
18004
bcd805923554
Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents:
12763
diff
changeset
|
131 mp_msg(MSGT_DECVIDEO,MSGL_WARN,MSGTR_MPCODECS_CouldntAllocateImageForCinepakCodec); |
8295 | 132 return NULL; |
133 } | |
134 | |
30606
caaa73737ef1
DirectShow requires stride to be a multiple of 4 for RGB24/BGR24, add
reimar
parents:
30605
diff
changeset
|
135 DMO_VideoDecoder_DecodeInternal(ctx->decoder, data, len, 1, buffer); |
8295 | 136 |
137 return mpi; | |
138 } |