diff options
-rw-r--r-- | DOCS/man/en/mplayer.1 | 122 | ||||
-rw-r--r-- | Makefile | 3 | ||||
-rw-r--r-- | cfg-mplayer.h | 6 | ||||
-rw-r--r-- | codec-cfg.c | 71 | ||||
-rwxr-xr-x | configure | 31 | ||||
-rw-r--r-- | etc/codecs.conf | 7 | ||||
-rw-r--r-- | libmpcodecs/vd.c | 4 | ||||
-rw-r--r-- | libmpcodecs/vd_zrmjpeg.c | 249 | ||||
-rw-r--r-- | libmpcodecs/vf.c | 4 | ||||
-rw-r--r-- | libmpcodecs/vf_zrmjpeg.c | 1049 | ||||
-rw-r--r-- | libvo/jpeg_enc.c | 485 | ||||
-rw-r--r-- | libvo/jpeg_enc.h | 52 | ||||
-rw-r--r-- | libvo/video_out.c | 6 | ||||
-rw-r--r-- | libvo/vo_zr.c | 837 | ||||
-rw-r--r-- | libvo/vo_zr.h | 29 | ||||
-rw-r--r-- | libvo/vo_zr2.c | 500 |
16 files changed, 0 insertions, 3455 deletions
diff --git a/DOCS/man/en/mplayer.1 b/DOCS/man/en/mplayer.1 index cea1eb36af..6d4c1471c0 100644 --- a/DOCS/man/en/mplayer.1 +++ b/DOCS/man/en/mplayer.1 @@ -3270,68 +3270,6 @@ currently. Supported by at least the direct3d, gl, gl2, x11, xv and corevideo video output drivers. . -.TP -.B \-zrbw (\-vo zr only) -Display in black and white. -For optimal performance, this can be combined with '\-lavdopts gray'. -. -.TP -.B \-zrcrop <[width]x[height]+[x offset]+[y offset]> (\-vo zr only) -Select a part of the input image to display, multiple occurrences -of this option switch on cinerama mode. -In cinerama mode the movie is distributed over more than one TV -(or beamer) to create a larger image. -Options appearing after the n-th \-zrcrop apply to the n-th MJPEG card, each -card should at least have a \-zrdev in addition to the \-zrcrop. -For examples, see the output of \-zrhelp and the Zr section of the -documentation. -. -.TP -.B \-zrdev <device> (\-vo zr only) -Specify the device special file that belongs to your MJPEG card, by default -the zr video output driver takes the first v4l device it can find. -. -.TP -.B \-zrfd (\-vo zr only) -Force decimation: Decimation, as specified by \-zrhdec and \-zrvdec, only -happens if the hardware scaler can stretch the image to its original size. -Use this option to force decimation. -. -.TP -.B \-zrhdec <1|2|4> (\-vo zr only) -Horizontal decimation: Ask the driver to send only every 2nd or 4th -line/\:pixel of the input image to the MJPEG card and use the scaler -of the MJPEG card to stretch the image to its original size. -. -.TP -.B \-zrhelp (\-vo zr only) -Display a list of all \-zr* options, their default values and a -cinerama mode example. -. -.TP -.B \-zrnorm <norm> (\-vo zr only) -Specify the TV norm as PAL or NTSC (default: no change). -. -.TP -.B \-zrquality <1\-20> (\-vo zr only) -A number from 1 (best) to 20 (worst) representing the JPEG encoding quality. -. -.TP -.B \-zrvdec <1|2|4> (\-vo zr only) -Vertical decimation: Ask the driver to send only every 2nd or 4th -line/\:pixel of the input image to the MJPEG card and use the scaler -of the MJPEG card to stretch the image to its original size. -. -.TP -.B \-zrxdoff <x display offset> (\-vo zr only) -If the movie is smaller than the TV screen, this option specifies the x -offset from the upper-left corner of the TV screen (default: centered). -. -.TP -.B \-zrydoff <y display offset> (\-vo zr only) -If the movie is smaller than the TV screen, this option specifies the y -offset from the upper-left corner of the TV screen (default: centered). -. . . .SH "VIDEO OUTPUT DRIVERS" @@ -4219,25 +4157,6 @@ output filename (default: ./grab.mpg) .PD 1 . .TP -.B zr (also see \-zr* and \-zrhelp) -Video output driver for a number of MJPEG capture/\:playback cards. -. -.TP -.B zr2 (also see the zrmjpeg video filter) -Video output driver for a number of MJPEG capture/\:playback cards, -second generation. -.PD 0 -.RSs -.IPs dev=<device> -Specifies the video device to use. -.IPs norm=<PAL|NTSC|SECAM|auto> -Specifies the video norm to use (default: auto). -.IPs (no)prebuf -(De)Activate prebuffering, not yet supported. -.RE -.PD 1 -. -.TP .B "md5sum\ " Calculate MD5 sums of each frame and write them to a file. Supports RGB24 and YV12 colorspaces. @@ -7261,35 +7180,6 @@ algorithm to remove the logo. .RE . .TP -.B zrmjpeg[=options] -Software YV12 to MJPEG encoder for use with the zr2 video -output device. -.RSs -.IPs maxheight=<h>|maxwidth=<w> -These options set the maximum width and height the zr card -can handle (the MPlayer filter layer currently cannot query those). -.IPs {dc10+,dc10,buz,lml33}-{PAL|NTSC} -Use these options to set maxwidth and maxheight automatically to the -values known for card/\:mode combo. -For example, valid options are: dc10-PAL and buz-NTSC (default: dc10+PAL) -.IPs color|bw -Select color or black and white encoding. -Black and white encoding is faster. -Color is the default. -.IPs hdec={1,2,4} -Horizontal decimation 1, 2 or 4. -.IPs vdec={1,2,4} -Vertical decimation 1, 2 or 4. -.IPs quality=1\-20 -Set JPEG compression quality [BEST] 1 \- 20 [VERY BAD]. -.IPs fd|nofd -By default, decimation is only performed if the Zoran hardware -can upscale the resulting MJPEG images to the original size. -The option fd instructs the filter to always perform the requested -decimation (ugly). -.RE -. -.TP .B screenshot Allows acquiring screenshots of the movie using slave mode commands that can be bound to keypresses. @@ -7861,18 +7751,6 @@ mplayer tv:// \-tv driver=v4l:width=640:height=480:outfmt=i420 \-vc rawi420 \-vo .fi . .PP -.B Playback on Zoran cards (old style, deprecated): -.nf -mplayer \-vo zr \-vf scale=352:288 file.avi -.fi -. -.PP -.B Playback on Zoran cards (new style): -.nf -mplayer \-vo zr2 \-vf scale=352:288,zrmjpeg file.avi -.fi -. -.PP .B Play DTS-CD with passthrough: .nf mplayer \-ac hwdts \-rawaudio format=0x2001 \-cdrom\-device /dev/cdrom cdda:// @@ -280,8 +280,6 @@ SRCS_COMMON-$(WIN32DLL) += libmpcodecs/ad_acm.c \ SRCS_COMMON-$(XANIM_CODECS) += libmpcodecs/vd_xanim.c SRCS_COMMON-$(XMMS_PLUGINS) += libmpdemux/demux_xmms.c SRCS_COMMON-$(XVID4) += libmpcodecs/vd_xvid4.c -SRCS_COMMON-$(ZR) += libmpcodecs/vd_zrmjpeg.c \ - libmpcodecs/vf_zrmjpeg.c SRCS_COMMON = asxparser.c \ av_log.c \ bstr.c \ @@ -562,7 +560,6 @@ SRCS_MPLAYER-$(XV) += libvo/vo_xv.c SRCS_MPLAYER-$(XVMC) += libvo/vo_xvmc.c SRCS_MPLAYER-$(XVR100) += libvo/vo_xvr100.c SRCS_MPLAYER-$(YUV4MPEG) += libvo/vo_yuv4mpeg.c -SRCS_MPLAYER-$(ZR) += libvo/jpeg_enc.c libvo/vo_zr.c libvo/vo_zr2.c SRCS_MPLAYER = command.c \ m_property.c \ diff --git a/cfg-mplayer.h b/cfg-mplayer.h index 084e73880b..e65890b35b 100644 --- a/cfg-mplayer.h +++ b/cfg-mplayer.h @@ -26,7 +26,6 @@ #include <stddef.h> #include "cfg-common.h" -#include "libvo/vo_zr.h" #include "options.h" extern char *fb_mode_cfgfile; @@ -216,11 +215,6 @@ const m_option_t mplayer_opts[]={ {"aa*", "-aa* has been removed. Use -vo aa:suboption instead.\n", CONF_TYPE_PRINT, 0, 0, 0, NULL}, #endif -#ifdef CONFIG_ZR - // -vo zr - {"zr*", vo_zr_parseoption, CONF_TYPE_FUNC_FULL, 0, 0, 0, &vo_zr_revertoption }, -#endif - //---------------------- mplayer-only options ------------------------ diff --git a/codec-cfg.c b/codec-cfg.c index 84402ada7b..a7d958ebc1 100644 --- a/codec-cfg.c +++ b/codec-cfg.c @@ -212,9 +212,6 @@ static const struct { {"BGR1", IMGFMT_BGR1}, {"MPES", IMGFMT_MPEGPES}, - {"ZRMJPEGNI", IMGFMT_ZRMJPEGNI}, - {"ZRMJPEGIT", IMGFMT_ZRMJPEGIT}, - {"ZRMJPEGIB", IMGFMT_ZRMJPEGIB}, {"IDCT_MPEG2",IMGFMT_XVMC_IDCT_MPEG2}, {"MOCO_MPEG2",IMGFMT_XVMC_MOCO_MPEG2}, @@ -296,74 +293,6 @@ err_out_parse_error: return 0; } -#if 0 -static short get_driver(char *s,int audioflag) -{ - static char *audiodrv[] = { - "null", - "mp3lib", - "pcm", - "libac3", - "acm", - "alaw", - "msgsm", - "dshow", - "dvdpcm", - "hwac3", - "libvorbis", - "ffmpeg", - "libmad", - "msadpcm", - "liba52", - "g72x", - "imaadpcm", - "dk4adpcm", - "dk3adpcm", - "roqaudio", - "faad", - "realaud", - "libdv", - NULL - }; - static char *videodrv[] = { - "null", - "libmpeg2", - "vfw", - "dshow", - "ffmpeg", - "vfwex", - "raw", - "msrle", - "xanim", - "msvidc", - "fli", - "cinepak", - "qtrle", - "nuv", - "cyuv", - "qtsmc", - "ducktm1", - "roqvideo", - "qtrpza", - "mpng", - "ijpg", - "zlib", - "mpegpes", - "zrmjpeg", - "realvid", - "xvid", - "libdv", - NULL - }; - char **drv=audioflag?audiodrv:videodrv; - int i; - - for(i=0;drv[i];i++) if(!strcmp(s,drv[i])) return i; - - return -1; -} -#endif - static int validate_codec(codecs_t *c, int type) { unsigned int i; @@ -420,7 +420,6 @@ Video output: --enable-s3fb enable s3fb (S3 ViRGE) video output [disable] --enable-wii enable Nintendo Wii/GameCube video output [disable] --enable-directfb enable DirectFB video output [autodetect] - --enable-zr enable ZR360[56]7/ZR36060 video output [autodetect] --enable-bl enable Blinkenlights video output [disable] --enable-tdfxvid enable tdfx_vid video output [disable] --enable-xvr100 enable SUN XVR-100 video output [autodetect] @@ -685,7 +684,6 @@ _tdfxvid=no _xvr100=auto _tga=yes _directfb=auto -_zr=auto _bl=no _largefiles=yes #language=en @@ -1110,8 +1108,6 @@ for ac_option do --enable-tga) _tga=yes ;; --enable-directfb) _directfb=yes ;; --disable-directfb) _directfb=no ;; - --enable-zr) _zr=yes ;; - --disable-zr) _zr=no ;; --enable-bl) _bl=yes ;; --disable-bl) _bl=no ;; --enable-mtrr) _mtrr=yes ;; @@ -6293,31 +6289,6 @@ else fi echores "$_xmga" -echocheck "zr" -if test "$_zr" = auto ; then - #36067's seem to identify themselves as 36057PQC's, so the line - #below should work for 36067's and 36057's. - if grep -q -s -e "Multimedia video controller: Zoran Corporation ZR36057" /proc/pci ; then - _zr=yes - else - _zr=no - fi -fi -if test "$_zr" = yes ; then - if test "$ffmpeg_internals" = yes ; then - def_zr='#define CONFIG_ZR 1' - vomodules="zr zr2 $vomodules" - else - res_comment="FFmpeg internal headers are required by zr, sorry" - novomodules="zr $novomodules" - def_zr='#undef CONFIG_ZR' - fi -else - def_zr='#undef CONFIG_ZR' - novomodules="zr zr2 $novomodules" -fi -echores "$_zr" - echocheck "UnRAR executable" if test "$_unrar_exec" = auto ; then @@ -7036,7 +7007,6 @@ XVID4 = $_xvid XVMC = $_xvmc XVR100 = $_xvr100 YUV4MPEG = $_yuv4mpeg -ZR = $_zr # FFmpeg FFMPEG = $ffmpeg @@ -7405,7 +7375,6 @@ $def_xv $def_xvmc $def_xvr100 $def_yuv4mpeg -$def_zr /* FFmpeg */ diff --git a/etc/codecs.conf b/etc/codecs.conf index d353bb5716..f80d717043 100644 --- a/etc/codecs.conf +++ b/etc/codecs.conf @@ -1367,13 +1367,6 @@ videocodec geomp4 ; ijpg only decodes JPEG images (no MJPEG), and slow. ; Update: ffmjpeg is almost perfect (and optimized) now, prefer it to others. -videocodec zrmjpeg - info "Zoran MJPEG passthrough" - status buggy - fourcc MJPG,jpeg - driver zrmjpeg - out ZRMJPEGNI,ZRMJPEGIT,ZRMJPEGIB query - videocodec ffmjpeg info "FFmpeg MJPEG" status working diff --git a/libmpcodecs/vd.c b/libmpcodecs/vd.c index c7c0b58759..cbe979a100 100644 --- a/libmpcodecs/vd.c +++ b/libmpcodecs/vd.c @@ -52,7 +52,6 @@ extern const vd_functions_t mpcodecs_vd_mtga; extern const vd_functions_t mpcodecs_vd_sgi; extern const vd_functions_t mpcodecs_vd_libmpeg2; extern const vd_functions_t mpcodecs_vd_mpegpes; -extern const vd_functions_t mpcodecs_vd_zrmjpeg; extern const vd_functions_t mpcodecs_vd_realvid; extern const vd_functions_t mpcodecs_vd_xvid; extern const vd_functions_t mpcodecs_vd_libdv; @@ -95,9 +94,6 @@ const vd_functions_t * const mpcodecs_vd_drivers[] = { &mpcodecs_vd_libmpeg2, #endif &mpcodecs_vd_mpegpes, -#ifdef CONFIG_ZR - &mpcodecs_vd_zrmjpeg, -#endif #ifdef CONFIG_REALCODECS &mpcodecs_vd_realvid, #endif diff --git a/libmpcodecs/vd_zrmjpeg.c b/libmpcodecs/vd_zrmjpeg.c deleted file mode 100644 index 8dd460ab5b..0000000000 --- a/libmpcodecs/vd_zrmjpeg.c +++ /dev/null @@ -1,249 +0,0 @@ -/* - * Copyright (C) 2005 Rik Snel <rsnel@cube.dyndns.org> - * - based on vd_mpegpes.c by A'rpi (C) 2002-2003 - * - guess_mjpeg_type code stolen from lav_io.c (C) 2000 Rainer Johanni - * <Rainer@Johanni.de> from the mjpegtools package - * - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> - -#include "config.h" -#include "mp_msg.h" -#include "vfcap.h" - -/* some convenient #define's, is this portable enough? */ -#define VERBOSE(...) mp_msg(MSGT_DECVIDEO, MSGL_V, "vd_zrmjpeg: " __VA_ARGS__) -#define ERROR(...) mp_msg(MSGT_DECVIDEO, MSGL_ERR, "vd_zrmjpeg: " __VA_ARGS__) -#define WARNING(...) mp_msg(MSGT_DECVIDEO, MSGL_WARN, \ - "vd_zrmjpeg: " __VA_ARGS__) - -#include "vd_internal.h" - -static const vd_info_t info = -{ - "Zoran MJPEG Video passthrough", - "zrmjpeg", - "Rik Snel <snel@phys.uu.nl>", - "Rik Snel <snel@phys.uu.nl>", - "for hw decoders (DC10(+)/buz/lml33)" -}; - -LIBVD_EXTERN(zrmjpeg) - -#include "libvo/video_out.h" - -typedef struct { - int vo_initialized; - unsigned int preferred_csp; -} vd_zrmjpeg_ctx_t; - -static int query_format(sh_video_t *sh, unsigned int format) { - vd_zrmjpeg_ctx_t *ctx = sh->context; - if (format == ctx->preferred_csp) return VFCAP_CSP_SUPPORTED; - return CONTROL_FALSE; -} - -// to set/get/query special features/parameters -static int control(sh_video_t *sh, int cmd, void* arg, ...) { - switch (cmd) { - case VDCTRL_QUERY_FORMAT: - return query_format(sh, *((unsigned int*)arg)); - } - return CONTROL_UNKNOWN; -} - -// init driver -static int init(sh_video_t *sh) { - vd_zrmjpeg_ctx_t *ctx; - - VERBOSE("init called\n"); - ctx = malloc(sizeof(*ctx)); - if (!ctx) return 0; - memset(ctx, 0, sizeof(*ctx)); - sh->context = ctx; - - /* defer init of vo until the first frame is known */ - return 1; -#if 0 - return mpcodecs_config_vo(sh, sh->disp_w, sh->disp_h, IMGFMT_ZRMJPEGIT); -#endif -} - -// uninit driver -static void uninit(sh_video_t *sh) { - free(sh->context); -} - -/* parts directly stolen from scan_jpg() and lav_open_input_file */ -static int get_int2(unsigned char *buf) { - return buf[0]*256 + buf[1]; -} - -#define M_SOF0 0xC0 -#define M_SOF1 0xC1 -#define M_DHT 0xC4 -#define M_SOI 0xD8 /* Start Of Image (beginning of datastream) */ -#define M_EOI 0xD9 /* End Of Image (end of datastream) */ -#define M_SOS 0xDA /* Start Of Scan (begins compressed data) */ -#define M_DQT 0xDB -#define M_APP0 0xE0 -#define M_APP1 0xE1 -/* returns 0 in case of failure */ -static unsigned int guess_mjpeg_type(unsigned char *data, unsigned int size, - int d_height) { - unsigned int p; - int marker, length, height, i, hf[3], vf[3]; - unsigned int app0 = 0, header = 0; - - /* The initial marker must be SIO */ - if (size < 2) { - ERROR("JPEG data too short (%d bytes)\n", size); - return 0; - } - - if (data[0] != 0xFF || data[1] != M_SOI) { - ERROR("JPEG data must start with FFD8, but doesn't\n"); - return 0; - } - - p = 2; /* pointer within jpeg data */ - - while (p < size) { - /* search 0xFF */ - while(data[p] != 0xFF) { - p++; - if (p >= size) return 0; - } - - /* get marker code, skip duplicate FF's */ - while(data[p] == 0xFF) { - p++; - if (p >= size) return 0; - } - - marker = data[p++]; - - /* marker may have an associated length */ - if (p <= size - 2) length = get_int2(data+p); - else length = 0; - - switch (marker) { - case M_SOF0: - case M_SOF1: - header = p-2; - VERBOSE("found offset of header %u\n", - header); - break; - case M_SOS: - size = 0; - continue; - case M_APP0: - app0 = p-2; - VERBOSE("found offset of APP0 %u\n", - app0); - break; - } - - /* these markers shouldn't have parameters, - * i.e. we don't need to skip anaything */ - if (marker == 0 || marker == 1 || - (marker >= 0xd0 && marker < 0xd8)) - continue; - - if (p + length <= size) p += length; - else { - ERROR("input JPEG too short, data missing\n"); - return 0; - } - } - - if (!header) { - ERROR("JPEG header (with resolution and sampling factors) not found\n"); - return 0; - } - - if (data[header + 9] != 3) { - ERROR("JPEG has wrong number of components\n"); - return 0; - } - - /* get the horizontal and vertical sample factors */ - for (i = 0; i < 3; i++) { - hf[i] = data[header + 10 + 3*i + 1]>>4; - vf[i] = data[header + 10 + 3*i + 1]&0x0F; - } - - if (hf[0] != 2 || hf[1] != 1 || hf[2] != 1 || - vf[0] != 1 || vf[1] != 1 || vf[2] != 1) { - ERROR("JPEG has wrong internal image format\n"); - } else VERBOSE("JPEG has colorspace YUV422 with minimal sampling factors (good)\n"); - - height = get_int2(data + header + 5); - if (height == d_height) { - VERBOSE("data is non interlaced\n"); - return IMGFMT_ZRMJPEGNI; - } - - if (2*height != d_height) { - ERROR("something very inconsistent happened\n"); - return 0; - } - - - if (app0 && get_int2(data + app0 + 2) >= 5 && - strncasecmp((char*)(data + app0 + 4), "AVI1", 4) == 0) { - if (data[app0+8] == 1) { - VERBOSE("data is interlaced, APP0: top-first (1)\n"); - return IMGFMT_ZRMJPEGIT; - } else { - VERBOSE("data is interlaced, APP0: bottom-first (%d)\n", - data[app0+8]); - return IMGFMT_ZRMJPEGIB; - } - } else { - VERBOSE("data is interlaced, no (valid) APP0 marker, " - "guessing top-first\n"); - return IMGFMT_ZRMJPEGIT; - } - - - return 0; -} - -// decode a frame -static mp_image_t* decode(sh_video_t *sh, void* data, int len, int flags) { - mp_image_t* mpi; - vd_zrmjpeg_ctx_t *ctx = sh->context; - - if (!ctx->vo_initialized) { - ctx->preferred_csp = guess_mjpeg_type(data, len, sh->disp_h); - if (ctx->preferred_csp == 0) return NULL; - mpcodecs_config_vo(sh, sh->disp_w, sh->disp_h, - ctx->preferred_csp); - ctx->vo_initialized = 1; - } - - mpi = mpcodecs_get_image(sh, MP_IMGTYPE_EXPORT, 0, - sh->disp_w, sh->disp_h); - /* abuse of mpi */ - mpi->planes[0]=(uint8_t*)data; - mpi->planes[1]=(uint8_t*)len; - return mpi; -} diff --git a/libmpcodecs/vf.c b/libmpcodecs/vf.c index bd4a63fb46..6355076726 100644 --- a/libmpcodecs/vf.c +++ b/libmpcodecs/vf.c @@ -55,7 +55,6 @@ extern const vf_info_t vf_info_rotate; extern const vf_info_t vf_info_mirror; extern const vf_info_t vf_info_palette; extern const vf_info_t vf_info_lavc; -extern const vf_info_t vf_info_zrmjpeg; extern const vf_info_t vf_info_dvbscale; extern const vf_info_t vf_info_cropdetect; extern const vf_info_t vf_info_test; @@ -144,9 +143,6 @@ static const vf_info_t* const filter_list[]={ &vf_info_screenshot, &vf_info_uspp, #endif -#ifdef CONFIG_ZR - &vf_info_zrmjpeg, -#endif &vf_info_dvbscale, &vf_info_cropdetect, &vf_info_test, diff --git a/libmpcodecs/vf_zrmjpeg.c b/libmpcodecs/vf_zrmjpeg.c deleted file mode 100644 index 7d504ad290..0000000000 --- a/libmpcodecs/vf_zrmjpeg.c +++ /dev/null @@ -1,1049 +0,0 @@ -/* - * This files includes a straightforward (to be) optimized JPEG encoder for - * the YUV422 format, based on mjpeg code from ffmpeg. - * - * For an excellent introduction to the JPEG format, see: - * http://www.ece.purdue.edu/~bouman/grad-labs/lab8/pdf/lab.pdf - * - * Copyright (C) 2005 Rik Snel <rsnel@cube.dyndns.org> - * - based on vd_lavc.c by A'rpi (C) 2002-2003 - * - parts from ffmpeg Copyright (c) 2000-2003 Fabrice Bellard - * - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -/** - * \file vf_zrmjpeg.c - * - * \brief Does mjpeg encoding as required by the zrmjpeg filter as well - * as by the zr video driver. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> - -#include "config.h" -#include "mp_msg.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vd_ffmpeg.h" -#include "vf.h" - -/* We need this #define because we need ../libavcodec/common.h to #define - * be2me_32, otherwise the linker will complain that it doesn't exist */ -#define HAVE_AV_CONFIG_H -#include "libavcodec/avcodec.h" -#include "libavcodec/mjpegenc.h" - -#undef malloc -#undef free - -/* some convenient #define's, is this portable enough? */ -/// Printout with vf_zrmjpeg: prefix at VERBOSE level -#define VERBOSE(...) mp_msg(MSGT_DECVIDEO, MSGL_V, "vf_zrmjpeg: " __VA_ARGS__) -/// Printout with vf_zrmjpeg: prefix at ERROR level -#define ERROR(...) mp_msg(MSGT_DECVIDEO, MSGL_ERR, "vf_zrmjpeg: " __VA_ARGS__) -/// Printout with vf_zrmjpeg: prefix at WARNING level -#define WARNING(...) mp_msg(MSGT_DECVIDEO, MSGL_WARN, \ - "vf_zrmjpeg: " __VA_ARGS__) - -/// The get_pixels() routine to use. The real routine comes from dsputil -static void (*get_pixels)(DCTELEM *restrict block, const uint8_t *pixels, int line_size); - -/* Begin excessive code duplication ************************************/ -/* Code coming from mpegvideo.c and mjpeg.c in ../libavcodec ***********/ - -/// copy of the table in mpegvideo.c -static const unsigned short aanscales[64] = { - /**< precomputed values scaled up by 14 bits */ - 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, - 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270, - 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906, - 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315, - 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, - 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552, - 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446, - 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247 -}; - -/// Precompute DCT quantizing matrix -/** - * This routine will precompute the combined DCT matrix with qscale - * and DCT renorm needed by the MPEG encoder here. It is basically the - * same as the routine with the same name in mpegvideo.c, except for - * some coefficient changes. The matrix will be computed in two variations, - * depending on the DCT version used. The second used by the MMX version of DCT. - * - * \param s MpegEncContext pointer - * \param qmat[OUT] pointer to where the matrix is stored - * \param qmat16[OUT] pointer to where matrix for MMX is stored. - * This matrix is not permutated - * and second 64 entries are bias - * \param quant_matrix[IN] the quantizion matrix to use - * \param bias bias for the quantizer - * \param qmin minimum qscale value to set up for - * \param qmax maximum qscale value to set up for - * - * Only rows between qmin and qmax will be populated in the matrix. - * In this MJPEG encoder, only the value 8 for qscale is used. - */ -static void convert_matrix(MpegEncContext *s, int (*qmat)[64], - uint16_t (*qmat16)[2][64], const uint16_t *quant_matrix, - int bias, int qmin, int qmax) { - int qscale; - - for(qscale = qmin; qscale <= qmax; qscale++) { - int i; - if (s->dsp.fdct == ff_jpeg_fdct_islow) { - for (i = 0; i < 64; i++) { - const int j = s->dsp.idct_permutation[i]; -/* 16 <= qscale * quant_matrix[i] <= 7905 - * 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 - * (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) - * >= (1<<36)/249205026 - * 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */ - qmat[qscale][i] = (int)((UINT64_C(1) << - (QMAT_SHIFT-3))/ - (qscale*quant_matrix[j])); - } - } else if (s->dsp.fdct == fdct_ifast) { - for (i = 0; i < 64; i++) { - const int j = s->dsp.idct_permutation[i]; -/* 16 <= qscale * quant_matrix[i] <= 7905 - * 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 - * (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) - * >= (1<<36)/249205026 - * 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */ - qmat[qscale][i] = (int)((UINT64_C(1) << - (QMAT_SHIFT + 11))/(aanscales[i] - *qscale * quant_matrix[j])); - } - } else { - for (i = 0; i < 64; i++) { - const int j = s->dsp.idct_permutation[i]; -/* We can safely assume that 16 <= quant_matrix[i] <= 255 - * So 16 <= qscale * quant_matrix[i] <= 7905 - * so (1<<19) / 16 >= (1<<19) / (qscale * quant_matrix[i]) >= (1<<19) / 7905 - * so 32768 >= (1<<19) / (qscale * quant_matrix[i]) >= 67 */ - qmat[qscale][i] = (int)((UINT64_C(1) << - QMAT_SHIFT_MMX) / (qscale - *quant_matrix[j])); - qmat16[qscale][0][i] = (1 << QMAT_SHIFT_MMX) - /(qscale * quant_matrix[j]); - - if (qmat16[qscale][0][i] == 0 || - qmat16[qscale][0][i] == 128*256) - qmat16[qscale][0][i]=128*256-1; - qmat16[qscale][1][i]=ROUNDED_DIV(bias - <<(16-QUANT_BIAS_SHIFT), - qmat16[qscale][0][i]); - } - } - } -} - -/// Emit the DC value into a MJPEG code sream -/** - * This routine is only intended to be used from encode_block - * - * \param s pointer to MpegEncContext structure - * \param val the DC value to emit - * \param huff_size pointer to huffman code size array - * \param huff_code pointer to the code array corresponding to \a huff_size - * - * This routine is a clone of mjpeg_encode_dc - */ -static inline void encode_dc(MpegEncContext *s, int val, - uint8_t *huff_size, uint16_t *huff_code) { - int mant, nbits; - - if (val == 0) { - put_bits(&s->pb, huff_size[0], huff_code[0]); - } else { - mant = val; - if (val < 0) { - val = -val; - mant--; - } - nbits= av_log2_16bit(val) + 1; - put_bits(&s->pb, huff_size[nbits], huff_code[nbits]); - put_bits(&s->pb, nbits, mant & ((1 << nbits) - 1)); - } -} - -/// Huffman encode and emit one DCT block into the MJPEG code stream -/** - * \param s pointer to MpegEncContext structure - * \param block pointer to the DCT block to emit - * \param n - * - * This routine is a duplicate of encode_block in mjpeg.c - */ -static void encode_block(MpegEncContext *s, DCTELEM *block, int n) { - int mant, nbits, code, i, j; - int component, dc, run, last_index, val; - MJpegContext *m = s->mjpeg_ctx; - uint8_t *huff_size_ac; - uint16_t *huff_code_ac; - - /* DC coef */ - component = (n <= 3 ? 0 : n - 4 + 1); - dc = block[0]; /* overflow is impossible */ - val = dc - s->last_dc[component]; - if (n < 4) { - encode_dc(s, val, m->huff_size_dc_luminance, - m->huff_code_dc_luminance); - huff_size_ac = m->huff_size_ac_luminance; - huff_code_ac = m->huff_code_ac_luminance; - } else { - encode_dc(s, val, m->huff_size_dc_chrominance, - m->huff_code_dc_chrominance); - huff_size_ac = m->huff_size_ac_chrominance; - huff_code_ac = m->huff_code_ac_chrominance; - } - s->last_dc[component] = dc; - - /* AC coefs */ - - run = 0; - last_index = s->block_last_index[n]; - for (i = 1; i <= last_index; i++) { - j = s->intra_scantable.permutated[i]; - val = block[j]; - if (val == 0) run++; - else { - while (run >= 16) { - put_bits(&s->pb, huff_size_ac[0xf0], - huff_code_ac[0xf0]); - run -= 16; - } - mant = val; - if (val < 0) { - val = -val; - mant--; - } - - nbits= av_log2_16bit(val) + 1; - code = (run << 4) | nbits; - - put_bits(&s->pb, huff_size_ac[code], - huff_code_ac[code]); - put_bits(&s->pb, nbits, mant & ((1 << nbits) - 1)); - run = 0; - } - } - - /* output EOB only if not already 64 values */ - if (last_index < 63 || run != 0) - put_bits(&s->pb, huff_size_ac[0], huff_code_ac[0]); -} - -/// clip overflowing DCT coefficients -/** - * If the computed DCT coefficients in a block overflow, this routine - * will go through them and clip them to be in the valid range. - * - * \param s pointer to MpegEncContext - * \param block pointer to DCT block to process - * \param last_index index of the last non-zero coefficient in block - * - * The max and min level, which are clipped to, are stored in - * s->min_qcoeff and s->max_qcoeff respectively. - */ -static inline void clip_coeffs(MpegEncContext *s, DCTELEM *block, - int last_index) { - int i; - const int maxlevel= s->max_qcoeff; - const int minlevel= s->min_qcoeff; - - for (i = 0; i <= last_index; i++) { - const in |