Mercurial > mplayer.hg
annotate libmpcodecs/vd_raw.c @ 27815:f92271dc5f17
Remove X11 backing store: this is now a useless flag.
Also, it is mandatory for Xserver 1.5.x (part of Xorg 7.4, shipped on all
Linux distributions starting from Oct. 08) and will be removed
from Xserver 1.6 anyhow ...
Patch by Stephane Marchesin (marchesin at icps dot u dash strasbg dot fr).
For more info, see long flame thread at:
http://lists.mplayerhq.hu/pipermail/mplayer-dev-eng/2008-August/058323.html
author | ben |
---|---|
date | Wed, 29 Oct 2008 22:03:36 +0000 |
parents | b90f13d1f7eb |
children | 0f1b5b68af32 |
rev | line source |
---|---|
4969 | 1 #include <stdio.h> |
2 #include <stdlib.h> | |
3 | |
4 #include "config.h" | |
5 #include "mp_msg.h" | |
6 | |
7 #include "vd_internal.h" | |
8 | |
9 static vd_info_t info = { | |
10 "RAW Uncompressed Video", | |
11 "raw", | |
12 "A'rpi", | |
13 "A'rpi & Alex", | |
14 "uncompressed" | |
15 }; | |
16 | |
17 LIBVD_EXTERN(raw) | |
18 | |
19 // to set/get/query special features/parameters | |
20 static int control(sh_video_t *sh,int cmd,void* arg,...){ | |
23298
4726edea2edd
Make vd_raw VDCTRL_QUERY_FORMAT simpler to understand
reimar
parents:
10742
diff
changeset
|
21 int format = sh->bih ? sh->bih->biCompression : sh->format; |
4969 | 22 switch(cmd){ |
23 case VDCTRL_QUERY_FORMAT: | |
23298
4726edea2edd
Make vd_raw VDCTRL_QUERY_FORMAT simpler to understand
reimar
parents:
10742
diff
changeset
|
24 if (*(int *)arg == format) return CONTROL_TRUE; |
25182 | 25 if (*(int *)arg == IMGFMT_YUY2 && format == MKTAG('y', 'u', 'v', '2')) return CONTROL_TRUE; |
4969 | 26 return CONTROL_FALSE; |
27 } | |
28 return CONTROL_UNKNOWN; | |
29 } | |
30 | |
31 // init driver | |
32 static int init(sh_video_t *sh){ | |
33 // set format fourcc for raw RGB: | |
6502 | 34 if(sh->bih && sh->bih->biCompression==0){ // set based on bit depth |
4969 | 35 switch(sh->bih->biBitCount){ |
7773 | 36 case 1: sh->bih->biCompression=IMGFMT_BGR1; break; |
37 case 4: sh->bih->biCompression=IMGFMT_BGR4; break; | |
6229 | 38 case 8: sh->bih->biCompression=IMGFMT_BGR8; break; |
39 case 15: sh->bih->biCompression=IMGFMT_BGR15; break; | |
40 // workaround bitcount==16 => bgr15 case for avi files: | |
41 case 16: sh->bih->biCompression=(sh->format)?IMGFMT_BGR16:IMGFMT_BGR15; break; | |
42 case 24: sh->bih->biCompression=IMGFMT_BGR24; break; | |
43 case 32: sh->bih->biCompression=IMGFMT_BGR32; break; | |
4969 | 44 default: |
45 mp_msg(MSGT_DECVIDEO,MSGL_WARN,"RAW: depth %d not supported\n",sh->bih->biBitCount); | |
46 } | |
47 } | |
6502 | 48 return mpcodecs_config_vo(sh,sh->disp_w,sh->disp_h,sh->bih ? sh->bih->biCompression : sh->format); |
4969 | 49 } |
50 | |
51 // uninit driver | |
52 static void uninit(sh_video_t *sh){ | |
53 } | |
54 | |
55 //mp_image_t* mpcodecs_get_image(sh_video_t *sh, int mp_imgtype, int mp_imgflag, int w, int h); | |
56 | |
57 // decode a frame | |
58 static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags){ | |
59 mp_image_t* mpi; | |
7773 | 60 int frame_size; |
25182 | 61 int format = sh->bih ? sh->bih->biCompression : sh->format; |
7773 | 62 |
4969 | 63 if(len<=0) return NULL; // skipped frame |
7773 | 64 |
4969 | 65 mpi=mpcodecs_get_image(sh, MP_IMGTYPE_EXPORT, 0, |
66 sh->disp_w, sh->disp_h); | |
67 if(!mpi) return NULL; | |
68 | |
69 if(mpi->flags&MP_IMGFLAG_PLANAR){ | |
70 // TODO !!! | |
71 mpi->planes[0]=data; | |
72 mpi->stride[0]=mpi->width; | |
7773 | 73 frame_size=mpi->stride[0]*mpi->h; |
10742
794b55a44528
basic nv12 and nv21 support by Angelo Cano <angelo_cano@fastmail.fm>
alex
parents:
7782
diff
changeset
|
74 if((mpi->imgfmt == IMGFMT_NV12) || (mpi->imgfmt == IMGFMT_NV21)) |
794b55a44528
basic nv12 and nv21 support by Angelo Cano <angelo_cano@fastmail.fm>
alex
parents:
7782
diff
changeset
|
75 { |
794b55a44528
basic nv12 and nv21 support by Angelo Cano <angelo_cano@fastmail.fm>
alex
parents:
7782
diff
changeset
|
76 mpi->planes[1]=mpi->planes[0]+mpi->width*mpi->height; |
794b55a44528
basic nv12 and nv21 support by Angelo Cano <angelo_cano@fastmail.fm>
alex
parents:
7782
diff
changeset
|
77 mpi->stride[1]=mpi->chroma_width; |
794b55a44528
basic nv12 and nv21 support by Angelo Cano <angelo_cano@fastmail.fm>
alex
parents:
7782
diff
changeset
|
78 frame_size+=mpi->chroma_width*mpi->chroma_height; |
794b55a44528
basic nv12 and nv21 support by Angelo Cano <angelo_cano@fastmail.fm>
alex
parents:
7782
diff
changeset
|
79 } else if(mpi->flags&MP_IMGFLAG_YUV) { |
794b55a44528
basic nv12 and nv21 support by Angelo Cano <angelo_cano@fastmail.fm>
alex
parents:
7782
diff
changeset
|
80 int cb=2, cr=1; |
794b55a44528
basic nv12 and nv21 support by Angelo Cano <angelo_cano@fastmail.fm>
alex
parents:
7782
diff
changeset
|
81 if(mpi->flags&MP_IMGFLAG_SWAPPED) { |
794b55a44528
basic nv12 and nv21 support by Angelo Cano <angelo_cano@fastmail.fm>
alex
parents:
7782
diff
changeset
|
82 cb=1; cr=2; |
794b55a44528
basic nv12 and nv21 support by Angelo Cano <angelo_cano@fastmail.fm>
alex
parents:
7782
diff
changeset
|
83 } |
5271
81f31373837e
adding support for 12 bit planar YUV formats (for YUV4MPEG(2))
rik
parents:
5124
diff
changeset
|
84 // Support for some common Planar YUV formats |
6480 | 85 /* YV12,I420,IYUV */ |
6667 | 86 mpi->planes[cb]=mpi->planes[0]+mpi->width*mpi->height; |
87 mpi->stride[cb]=mpi->chroma_width; | |
88 mpi->planes[cr]=mpi->planes[cb]+mpi->chroma_width*mpi->chroma_height; | |
89 mpi->stride[cr]=mpi->chroma_width; | |
7773 | 90 frame_size+=2*mpi->chroma_width*mpi->chroma_height; |
5271
81f31373837e
adding support for 12 bit planar YUV formats (for YUV4MPEG(2))
rik
parents:
5124
diff
changeset
|
91 } |
4969 | 92 } else { |
93 mpi->planes[0]=data; | |
94 mpi->stride[0]=mpi->width*(mpi->bpp/8); | |
6229 | 95 // .AVI files has uncompressed lines 4-byte aligned: |
96 if(sh->format==0 || sh->format==3) mpi->stride[0]=(mpi->stride[0]+3)&(~3); | |
5899 | 97 if(mpi->imgfmt==IMGFMT_RGB8 || mpi->imgfmt==IMGFMT_BGR8){ |
98 // export palette: | |
7782 | 99 mpi->planes[1]=sh->bih ? (unsigned char*)(sh->bih+1) : NULL; |
100 #if 0 | |
101 printf("Exporting palette: %p !!\n",mpi->planes[1]); | |
102 { unsigned char* p=mpi->planes[1]; | |
103 int i; | |
104 for(i=0;i<64;i++) printf("%3d: %02X %02X %02X (%02X)\n",i,p[4*i],p[4*i+1],p[4*i+2],p[4*i+3]); | |
105 } | |
106 #endif | |
5899 | 107 } |
7773 | 108 frame_size=mpi->stride[0]*mpi->h; |
25182 | 109 if (format == MKTAG('y', 'u', 'v', '2')) { |
110 int i; | |
111 for (i = 1; i < frame_size; i += 2) | |
112 mpi->planes[0][i] ^= 128; | |
113 } | |
7773 | 114 if(mpi->bpp<8) frame_size=frame_size*mpi->bpp/8; |
115 } | |
116 | |
117 if(len<frame_size){ | |
118 mp_msg(MSGT_DECVIDEO,MSGL_WARN,"Frame too small! (%d<%d) Wrong format?\n", | |
119 len,frame_size); | |
120 return NULL; | |
4969 | 121 } |
122 | |
123 return mpi; | |
124 } |