diff options
-rw-r--r-- | DOCS/tech/general.txt | 2 | ||||
-rw-r--r-- | fmt-conversion.c | 4 | ||||
-rw-r--r-- | libmenu/menu.c | 3 | ||||
-rw-r--r-- | libmpcodecs/img_format.c | 2 | ||||
-rw-r--r-- | libmpcodecs/img_format.h | 10 | ||||
-rw-r--r-- | libmpcodecs/vf_1bpp.c | 6 | ||||
-rw-r--r-- | libmpcodecs/vf_expand.c | 4 | ||||
-rw-r--r-- | libmpcodecs/vf_rgbtest.c | 8 | ||||
-rw-r--r-- | libmpcodecs/vf_scale.c | 2 | ||||
-rw-r--r-- | libmpcodecs/vf_screenshot.c | 1 | ||||
-rw-r--r-- | libmpcodecs/vf_tile.c | 8 | ||||
-rw-r--r-- | libmpdemux/demux_lavf.c | 2 | ||||
-rw-r--r-- | libvo/osd.c | 33 | ||||
-rw-r--r-- | libvo/osd.h | 2 | ||||
-rw-r--r-- | libvo/vo_directfb2.c | 19 | ||||
-rw-r--r-- | libvo/vo_fbdev.c | 13 | ||||
-rw-r--r-- | libvo/vo_fbdev2.c | 8 | ||||
-rw-r--r-- | m_option.c | 2 | ||||
-rw-r--r-- | mp3lib/sr1.c | 1 |
19 files changed, 123 insertions, 7 deletions
diff --git a/DOCS/tech/general.txt b/DOCS/tech/general.txt index 4ca3671cf3..b9ac61ff10 100644 --- a/DOCS/tech/general.txt +++ b/DOCS/tech/general.txt @@ -196,7 +196,7 @@ Now, go on: Only used if none of the above works. 4. Codecs. Consists of libmpcodecs/* and separate files or libs, - for example liba52, libmpeg2, xa/*, alaw.c, opendivx/*, loader, mp3lib. + for example liba52, libmpeg2, loader, mp3lib. mplayer.c doesn't call them directly, but through the dec_audio.c and dec_video.c files, so the mplayer.c doesn't have to know anything about diff --git a/fmt-conversion.c b/fmt-conversion.c index 013e3fea55..9e881009e4 100644 --- a/fmt-conversion.c +++ b/fmt-conversion.c @@ -32,6 +32,8 @@ static const struct { {IMGFMT_BGR16LE, PIX_FMT_RGB565LE}, {IMGFMT_BGR15BE, PIX_FMT_RGB555BE}, {IMGFMT_BGR15LE, PIX_FMT_RGB555LE}, + {IMGFMT_BGR12BE, PIX_FMT_RGB444BE}, + {IMGFMT_BGR12LE, PIX_FMT_RGB444LE}, {IMGFMT_BGR8, PIX_FMT_RGB8}, {IMGFMT_BGR4, PIX_FMT_RGB4}, {IMGFMT_BGR1, PIX_FMT_MONOBLACK}, @@ -47,6 +49,8 @@ static const struct { {IMGFMT_RGB16LE, PIX_FMT_BGR565LE}, {IMGFMT_RGB15BE, PIX_FMT_BGR555BE}, {IMGFMT_RGB15LE, PIX_FMT_BGR555LE}, + {IMGFMT_RGB12BE, PIX_FMT_BGR444BE}, + {IMGFMT_RGB12LE, PIX_FMT_BGR444LE}, {IMGFMT_RGB8, PIX_FMT_BGR8}, {IMGFMT_RGB4, PIX_FMT_BGR4}, {IMGFMT_BGR8, PIX_FMT_PAL8}, diff --git a/libmenu/menu.c b/libmenu/menu.c index c80f7a0adf..ef3804fbe3 100644 --- a/libmenu/menu.c +++ b/libmenu/menu.c @@ -385,6 +385,9 @@ typedef void (*draw_alpha_f)(int w,int h, unsigned char* src, unsigned char *src inline static draw_alpha_f get_draw_alpha(uint32_t fmt) { switch(fmt) { + case IMGFMT_BGR12: + case IMGFMT_RGB12: + return vo_draw_alpha_rgb12; case IMGFMT_BGR15: case IMGFMT_RGB15: return vo_draw_alpha_rgb15; diff --git a/libmpcodecs/img_format.c b/libmpcodecs/img_format.c index 830180a55c..9becd772da 100644 --- a/libmpcodecs/img_format.c +++ b/libmpcodecs/img_format.c @@ -29,6 +29,7 @@ const char *vo_format_name(int format) case IMGFMT_RGB4: return "RGB 4-bit"; case IMGFMT_RG4B: return "RGB 4-bit per byte"; case IMGFMT_RGB8: return "RGB 8-bit"; + case IMGFMT_RGB12: return "RGB 12-bit"; case IMGFMT_RGB15: return "RGB 15-bit"; case IMGFMT_RGB16: return "RGB 16-bit"; case IMGFMT_RGB24: return "RGB 24-bit"; @@ -39,6 +40,7 @@ const char *vo_format_name(int format) case IMGFMT_BGR4: return "BGR 4-bit"; case IMGFMT_BG4B: return "BGR 4-bit per byte"; case IMGFMT_BGR8: return "BGR 8-bit"; + case IMGFMT_BGR12: return "BGR 12-bit"; case IMGFMT_BGR15: return "BGR 15-bit"; case IMGFMT_BGR16: return "BGR 16-bit"; case IMGFMT_BGR24: return "BGR 24-bit"; diff --git a/libmpcodecs/img_format.h b/libmpcodecs/img_format.h index 2c4db36a04..e5800828d0 100644 --- a/libmpcodecs/img_format.h +++ b/libmpcodecs/img_format.h @@ -29,6 +29,7 @@ #define IMGFMT_RGB4 (IMGFMT_RGB|4) #define IMGFMT_RGB4_CHAR (IMGFMT_RGB|4|128) // RGB4 with 1 pixel per byte #define IMGFMT_RGB8 (IMGFMT_RGB|8) +#define IMGFMT_RGB12 (IMGFMT_RGB|12) #define IMGFMT_RGB15 (IMGFMT_RGB|15) #define IMGFMT_RGB16 (IMGFMT_RGB|16) #define IMGFMT_RGB24 (IMGFMT_RGB|24) @@ -42,6 +43,7 @@ #define IMGFMT_BGR4 (IMGFMT_BGR|4) #define IMGFMT_BGR4_CHAR (IMGFMT_BGR|4|128) // BGR4 with 1 pixel per byte #define IMGFMT_BGR8 (IMGFMT_BGR|8) +#define IMGFMT_BGR12 (IMGFMT_BGR|12) #define IMGFMT_BGR15 (IMGFMT_BGR|15) #define IMGFMT_BGR16 (IMGFMT_BGR|16) #define IMGFMT_BGR24 (IMGFMT_BGR|24) @@ -53,10 +55,14 @@ #define IMGFMT_ARGB IMGFMT_BGR32 #define IMGFMT_RGBA (IMGFMT_BGR32|64) #define IMGFMT_RGB48NE IMGFMT_RGB48BE +#define IMGFMT_RGB12BE IMGFMT_RGB12 +#define IMGFMT_RGB12LE (IMGFMT_RGB12|64) #define IMGFMT_RGB15BE IMGFMT_RGB15 #define IMGFMT_RGB15LE (IMGFMT_RGB15|64) #define IMGFMT_RGB16BE IMGFMT_RGB16 #define IMGFMT_RGB16LE (IMGFMT_RGB16|64) +#define IMGFMT_BGR12BE IMGFMT_BGR12 +#define IMGFMT_BGR12LE (IMGFMT_BGR12|64) #define IMGFMT_BGR15BE IMGFMT_BGR15 #define IMGFMT_BGR15LE (IMGFMT_BGR15|64) #define IMGFMT_BGR16BE IMGFMT_BGR16 @@ -67,10 +73,14 @@ #define IMGFMT_ARGB (IMGFMT_RGB32|64) #define IMGFMT_RGBA IMGFMT_RGB32 #define IMGFMT_RGB48NE IMGFMT_RGB48LE +#define IMGFMT_RGB12BE (IMGFMT_RGB12|64) +#define IMGFMT_RGB12LE IMGFMT_RGB12 #define IMGFMT_RGB15BE (IMGFMT_RGB15|64) #define IMGFMT_RGB15LE IMGFMT_RGB15 #define IMGFMT_RGB16BE (IMGFMT_RGB16|64) #define IMGFMT_RGB16LE IMGFMT_RGB16 +#define IMGFMT_BGR12BE (IMGFMT_BGR12|64) +#define IMGFMT_BGR12LE IMGFMT_BGR12 #define IMGFMT_BGR15BE (IMGFMT_BGR15|64) #define IMGFMT_BGR15LE IMGFMT_BGR15 #define IMGFMT_BGR16BE (IMGFMT_BGR16|64) diff --git a/libmpcodecs/vf_1bpp.c b/libmpcodecs/vf_1bpp.c index ee8ecfbadc..915411e96f 100644 --- a/libmpcodecs/vf_1bpp.c +++ b/libmpcodecs/vf_1bpp.c @@ -45,6 +45,8 @@ static const unsigned int bgr_list[]={ IMGFMT_444P, IMGFMT_YUY2, + IMGFMT_BGR12, + IMGFMT_RGB12, IMGFMT_BGR15, IMGFMT_RGB15, IMGFMT_BGR16, @@ -150,6 +152,10 @@ static int put_image(struct vf_instance* vf, mp_image_t *mpi, double pts){ case IMGFMT_YUY2: convert(mpi,dmpi,0x8000,0x80ff,2); break; + case IMGFMT_BGR12: + case IMGFMT_RGB12: + convert(mpi,dmpi,0,0x0fff,2); + break; case IMGFMT_BGR15: case IMGFMT_RGB15: convert(mpi,dmpi,0,0x7fff,2); diff --git a/libmpcodecs/vf_expand.c b/libmpcodecs/vf_expand.c index 669e512d4e..683ed633fe 100644 --- a/libmpcodecs/vf_expand.c +++ b/libmpcodecs/vf_expand.c @@ -147,6 +147,10 @@ static void draw_func(void *ctx, int x0,int y0, int w,int h,unsigned char* src, vf->dmpi->stride[0]*y0+ (vf->dmpi->bpp>>3)*x0; switch(vf->dmpi->imgfmt){ + case IMGFMT_BGR12: + case IMGFMT_RGB12: + vo_draw_alpha_rgb12(w, h, src, srca, stride, dst, vf->dmpi->stride[0]); + break; case IMGFMT_BGR15: case IMGFMT_RGB15: vo_draw_alpha_rgb15(w,h,src,srca,stride,dst,vf->dmpi->stride[0]); diff --git a/libmpcodecs/vf_rgbtest.c b/libmpcodecs/vf_rgbtest.c index b7fc3aa55a..02f2774a05 100644 --- a/libmpcodecs/vf_rgbtest.c +++ b/libmpcodecs/vf_rgbtest.c @@ -37,11 +37,13 @@ struct vf_priv_s { static unsigned int getfmt(unsigned int outfmt){ switch(outfmt){ + case IMGFMT_RGB12: case IMGFMT_RGB15: case IMGFMT_RGB16: case IMGFMT_RGB24: case IMGFMT_RGBA: case IMGFMT_ARGB: + case IMGFMT_BGR12: case IMGFMT_BGR15: case IMGFMT_BGR16: case IMGFMT_BGR24: @@ -54,6 +56,12 @@ static unsigned int getfmt(unsigned int outfmt){ static void put_pixel(uint8_t *buf, int x, int y, int stride, int r, int g, int b, int fmt){ switch(fmt){ + case IMGFMT_BGR12: ((uint16_t*)(buf + y*stride))[x]= + ((r >> 4) << 8) | ((g >> 4) << 4) | (b >> 4); + break; + case IMGFMT_RGB12: ((uint16_t*)(buf + y*stride))[x]= + ((b >> 4) << 8) | ((g >> 4) << 4) | (r >> 4); + break; case IMGFMT_BGR15: ((uint16_t*)(buf + y*stride))[x]= ((r>>3)<<10) | ((g>>3)<<5) | (b>>3); break; case IMGFMT_RGB15: ((uint16_t*)(buf + y*stride))[x]= ((b>>3)<<10) | ((g>>3)<<5) | (r>>3); diff --git a/libmpcodecs/vf_scale.c b/libmpcodecs/vf_scale.c index 6a661c567e..94beeddabd 100644 --- a/libmpcodecs/vf_scale.c +++ b/libmpcodecs/vf_scale.c @@ -96,6 +96,8 @@ static const unsigned int outfmt_list[]={ IMGFMT_RGB16, IMGFMT_BGR15, IMGFMT_RGB15, + IMGFMT_BGR12, + IMGFMT_RGB12, IMGFMT_Y800, IMGFMT_Y8, IMGFMT_BGR8, diff --git a/libmpcodecs/vf_screenshot.c b/libmpcodecs/vf_screenshot.c index a2680cc6d1..2ddd0e4ab6 100644 --- a/libmpcodecs/vf_screenshot.c +++ b/libmpcodecs/vf_screenshot.c @@ -258,6 +258,7 @@ static int query_format(struct vf_instance* vf, unsigned int fmt) case IMGFMT_BGR24: case IMGFMT_BGR16: case IMGFMT_BGR15: + case IMGFMT_BGR12: case IMGFMT_RGB32: case IMGFMT_RGB24: case IMGFMT_Y800: diff --git a/libmpcodecs/vf_tile.c b/libmpcodecs/vf_tile.c index 9192f5bf5f..0930a00c87 100644 --- a/libmpcodecs/vf_tile.c +++ b/libmpcodecs/vf_tile.c @@ -197,16 +197,18 @@ static void uninit(struct vf_instance* vf) free(vf->priv); } -/* rgb/bgr 15->32 supported & some Yxxx */ +/* rgb/bgr 12->32 supported & some Yxxx */ static int query_format(struct vf_instance* vf, unsigned int fmt) { switch (fmt) { - /* rgb 15 -> 32 bit */ + /* rgb 12...32 bit */ + case IMGFMT_RGB12: case IMGFMT_RGB15: case IMGFMT_RGB16: case IMGFMT_RGB24: case IMGFMT_RGB32: - /* bgr 15 -> 32 bit */ + /* bgr 12...32 bit */ + case IMGFMT_BGR12: case IMGFMT_BGR15: case IMGFMT_BGR16: case IMGFMT_BGR24: diff --git a/libmpdemux/demux_lavf.c b/libmpdemux/demux_lavf.c index bbf7218e43..2cdacff30c 100644 --- a/libmpdemux/demux_lavf.c +++ b/libmpdemux/demux_lavf.c @@ -428,7 +428,7 @@ static void handle_stream(demuxer_t *demuxer, AVFormatContext *avfc, int i) { break; sh_sub = new_sh_sub_sid(demuxer, i, priv->sub_streams); if(!sh_sub) break; - stream_type = "subtitles"; + stream_type = "subtitle"; priv->sstreams[priv->sub_streams] = i; sh_sub->type = type; if (codec->extradata_size) { diff --git a/libvo/osd.c b/libvo/osd.c index a3664dadb3..54854c785f 100644 --- a/libvo/osd.c +++ b/libvo/osd.c @@ -329,6 +329,39 @@ void vo_draw_alpha_init(void){ } } +void vo_draw_alpha_rgb12(int w, int h, unsigned char* src, unsigned char *srca, + int srcstride, unsigned char* dstbase, int dststride) { + int y; + for (y = 0; y < h; y++) { + register unsigned short *dst = (unsigned short*) dstbase; + register int x; + for (x = 0; x < w; x++) { + if(srca[x]){ +#ifdef FAST_OSD +#ifdef FAST_OSD_TABLE + dst[x] = fast_osd_12bpp_table[src[x]]; +#else + register unsigned int a = src[x] >> 4; + dst[x] = (a << 8) | (a << 4) | a; +#endif +#else + unsigned char r = dst[x] & 0x0F; + unsigned char g = (dst[x] >> 4) & 0x0F; + unsigned char b = (dst[x] >> 8) & 0x0F; + r = (((r*srca[x]) >> 4) + src[x]) >> 4; + g = (((g*srca[x]) >> 4) + src[x]) >> 4; + b = (((b*srca[x]) >> 4) + src[x]) >> 4; + dst[x] = (b << 8) | (g << 4) | r; +#endif + } + } + src += srcstride; + srca += srcstride; + dstbase += dststride; + } + return; +} + void vo_draw_alpha_rgb15(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride){ int y; for(y=0;y<h;y++){ diff --git a/libvo/osd.h b/libvo/osd.h index 7773149b79..4d79e854c8 100644 --- a/libvo/osd.h +++ b/libvo/osd.h @@ -29,6 +29,8 @@ void vo_draw_alpha_yuy2(int w, int h, unsigned char* src, unsigned char *srca, void vo_draw_alpha_uyvy(int w, int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase, int dststride); void vo_draw_alpha_rgb24(int w, int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase, int dststride); void vo_draw_alpha_rgb32(int w, int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase, int dststride); +void vo_draw_alpha_rgb12(int w, int h, unsigned char* src, unsigned char *srca, + int srcstride, unsigned char* dstbase, int dststride); void vo_draw_alpha_rgb15(int w, int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase, int dststride); void vo_draw_alpha_rgb16(int w, int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase, int dststride); diff --git a/libvo/vo_directfb2.c b/libvo/vo_directfb2.c index 673882dd49..0c2fb9b423 100644 --- a/libvo/vo_directfb2.c +++ b/libvo/vo_directfb2.c @@ -317,9 +317,13 @@ DFBSurfacePixelFormat convformat(uint32_t format) #if DIRECTFBVERSION > DFB_VERSION(0,9,15) case IMGFMT_RGB15: return DSPF_ARGB1555; break; case IMGFMT_BGR15: return DSPF_ARGB1555; break; + case IMGFMT_RGB12: return DSPF_ARGB4444; break; + case IMGFMT_BGR12: return DSPF_ARGB4444; break; #else case IMGFMT_RGB15: return DSPF_RGB15; break; case IMGFMT_BGR15: return DSPF_RGB15; break; + case IMGFMT_RGB12: return DSPF_RGB12; break; + case IMGFMT_BGR12: return DSPF_RGB12; break; #endif case IMGFMT_YUY2: return DSPF_YUY2; break; case IMGFMT_UYVY: return DSPF_UYVY; break; @@ -539,6 +543,8 @@ static int config(uint32_t s_width, uint32_t s_height, uint32_t d_width, case IMGFMT_BGR16: case IMGFMT_RGB15: case IMGFMT_BGR15: + case IMGFMT_RGB12: + case IMGFMT_BGR12: params.bpp=16; break; default: params.bpp=0; @@ -663,8 +669,10 @@ static int config(uint32_t s_width, uint32_t s_height, uint32_t d_width, case DSPF_RGB16: bpp=16;break; #if DIRECTFBVERSION > DFB_VERSION(0,9,15) case DSPF_ARGB1555: bpp=15;break; + case DSPF_ARGB4444: bpp=12; break; #else case DSPF_RGB15: bpp=15;break; + case DSPF_RGB12: bpp=12; break; #endif case DSPF_RGB332 : bpp=8;break; } @@ -676,8 +684,10 @@ static int config(uint32_t s_width, uint32_t s_height, uint32_t d_width, case DSPF_RGB16: #if DIRECTFBVERSION > DFB_VERSION(0,9,15) case DSPF_ARGB1555: + case DSPF_ARGB4444: #else case DSPF_RGB15: + case DSPF_RGB12: #endif case DSPF_RGB332: mp_msg(MSGT_VO, MSGL_V,"DirectFB: Trying to recover via videomode change (VM).\n"); @@ -1473,6 +1483,15 @@ static void draw_alpha(int x0, int y0, int w, int h, unsigned char *src, #endif vo_draw_alpha_rgb15(w,h,src,srca,stride,((uint8_t *) dst)+pitch*y0 + 2*x0,pitch); break; +#if DIRECTFBVERSION > DFB_VERSION(0,9,15) + case DSPF_ARGB4444: +#else + case DSPF_RGB12: +#endif + vo_draw_alpha_rgb12(w, h, src, srca, stride, + ((uint8_t *) dst) + pitch * y0 + 2 * x0, + pitch); + break; case DSPF_YUY2: vo_draw_alpha_yuy2(w,h,src,srca,stride,((uint8_t *) dst) + pitch*y0 + 2*x0,pitch); diff --git a/libvo/vo_fbdev.c b/libvo/vo_fbdev.c index 4534b17d9f..0bddd8dfce 100644 --- a/libvo/vo_fbdev.c +++ b/libvo/vo_fbdev.c @@ -521,6 +521,13 @@ static void set_bpp(struct fb_var_screeninfo *p, int bpp) p->green.offset = 5; p->blue.length = 5; break; + case 12: + p->red.offset = 8; + p->green.length = 4; + p->red.length = 4; + p->green.offset = 4; + p->blue.length = 4; + break; } } @@ -700,7 +707,8 @@ static int fb_preinit(int reset) } if (vo_dbpp) { - if (vo_dbpp != 15 && vo_dbpp != 16 && vo_dbpp != 24 && vo_dbpp != 32) { + if (vo_dbpp != 12 && vo_dbpp != 15 && vo_dbpp != 16 + && vo_dbpp != 24 && vo_dbpp != 32) { mp_msg(MSGT_VO, MSGL_ERR, "can't switch to %d bpp\n", vo_dbpp); goto err_out; } @@ -850,6 +858,9 @@ static int config(uint32_t width, uint32_t height, uint32_t d_width, case 15: draw_alpha_p = vo_draw_alpha_rgb15; break; + case 12: + draw_alpha_p = vo_draw_alpha_rgb12; + break; default: return 1; } diff --git a/libvo/vo_fbdev2.c b/libvo/vo_fbdev2.c index 491911ad6c..60bdee9a17 100644 --- a/libvo/vo_fbdev2.c +++ b/libvo/vo_fbdev2.c @@ -77,6 +77,13 @@ static void set_bpp(struct fb_var_screeninfo *p, int bpp) p->green.offset = 5; p->blue.length = 5; break; + case 12: + p->red.offset = 8; + p->green.length = 4; + p->red.length = 4; + p->green.offset = 4; + p->blue.length = 4; + break; } } @@ -247,6 +254,7 @@ static int config(uint32_t width, uint32_t height, uint32_t d_width, case 24: draw_alpha_p = vo_draw_alpha_rgb24; break; case 16: draw_alpha_p = vo_draw_alpha_rgb16; break; case 15: draw_alpha_p = vo_draw_alpha_rgb15; break; + case 12: draw_alpha_p = vo_draw_alpha_rgb12; break; default: return 1; } diff --git a/m_option.c b/m_option.c index 63436bb165..36e538f6f3 100644 --- a/m_option.c +++ b/m_option.c @@ -1118,6 +1118,7 @@ static struct { {"bgr32", IMGFMT_BGR32}, {"bgr16", IMGFMT_BGR16}, {"bgr15", IMGFMT_BGR15}, + {"bgr12", IMGFMT_BGR12}, {"bgr8", IMGFMT_BGR8}, {"bgr4", IMGFMT_BGR4}, {"bg4b", IMGFMT_BG4B}, @@ -1129,6 +1130,7 @@ static struct { {"rgb32", IMGFMT_RGB32}, {"rgb16", IMGFMT_RGB16}, {"rgb15", IMGFMT_RGB15}, + {"rgb12", IMGFMT_RGB12}, {"rgb8", IMGFMT_RGB8}, {"rgb4", IMGFMT_RGB4}, {"rg4b", IMGFMT_RG4B}, diff --git a/mp3lib/sr1.c b/mp3lib/sr1.c index 0dacec0156..57f05787e2 100644 --- a/mp3lib/sr1.c +++ b/mp3lib/sr1.c @@ -18,7 +18,6 @@ #include "mp3.h" #include "mpbswap.h" #include "cpudetect.h" -//#include "liba52/mm_accel.h" #include "mp_msg.h" #include "libmpcodecs/ad_mp3lib.h" #include "libvo/fastmemcpy.h" |