summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--etc/codecs.conf2
-rw-r--r--libmpcodecs/vd_theora.c27
2 files changed, 20 insertions, 9 deletions
diff --git a/etc/codecs.conf b/etc/codecs.conf
index bbdc753be4..26a052911e 100644
--- a/etc/codecs.conf
+++ b/etc/codecs.conf
@@ -584,7 +584,7 @@ videocodec theora
fourcc theo,Thra
driver theora
dll libtheora
- out YV12
+ out YV12,422P,444P
; prefer native codecs over win32?
; the win32 codecs probably are (better) optimized and support direct
diff --git a/libmpcodecs/vd_theora.c b/libmpcodecs/vd_theora.c
index 35e3edfab8..b8be6d747b 100644
--- a/libmpcodecs/vd_theora.c
+++ b/libmpcodecs/vd_theora.c
@@ -41,11 +41,28 @@ LIBVD_EXTERN(theora)
#define THEORA_NUM_HEADER_PACKETS 3
+typedef struct theora_struct_st {
+ theora_state st;
+ theora_comment cc;
+ theora_info inf;
+} theora_struct_t;
+
+/** Convert Theora pixelformat to the corresponding IMGFMT_ */
+static uint32_t theora_pixelformat2imgfmt(theora_pixelformat fmt){
+ switch(fmt) {
+ case OC_PF_420: return IMGFMT_YV12;
+ case OC_PF_422: return IMGFMT_422P;
+ case OC_PF_444: return IMGFMT_444P;
+ }
+ return 0;
+}
+
// to set/get/query special features/parameters
static int control(sh_video_t *sh,int cmd,void* arg,...){
+ theora_struct_t *context = sh->context;
switch(cmd) {
case VDCTRL_QUERY_FORMAT:
- if (*(int*)arg == IMGFMT_YV12)
+ if (*(int*)arg == theora_pixelformat2imgfmt(context->inf.pixelformat))
return CONTROL_TRUE;
return CONTROL_FALSE;
}
@@ -53,12 +70,6 @@ static int control(sh_video_t *sh,int cmd,void* arg,...){
return CONTROL_UNKNOWN;
}
-typedef struct theora_struct_st {
- theora_state st;
- theora_comment cc;
- theora_info inf;
-} theora_struct_t;
-
/*
* init driver
*/
@@ -104,7 +115,7 @@ static int init(sh_video_t *sh){
mp_msg(MSGT_DECVIDEO,MSGL_V,"INFO: Theora video init ok!\n");
- return mpcodecs_config_vo (sh,context->inf.frame_width,context->inf.frame_height,IMGFMT_YV12);
+ return mpcodecs_config_vo (sh,context->inf.frame_width,context->inf.frame_height,theora_pixelformat2imgfmt(context->inf.pixelformat));
err_out:
free(context);