diff options
Diffstat (limited to 'src/libxvid/xine_decoder.c')
-rw-r--r-- | src/libxvid/xine_decoder.c | 276 |
1 files changed, 0 insertions, 276 deletions
diff --git a/src/libxvid/xine_decoder.c b/src/libxvid/xine_decoder.c deleted file mode 100644 index f8856edaa..000000000 --- a/src/libxvid/xine_decoder.c +++ /dev/null @@ -1,276 +0,0 @@ -/* - * Copyright (C) 2000-2003 the xine project - * - * This file is part of xine, a free video player. - * - * xine 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. - * - * xine 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 this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - * - * XviD video decoder plugin (libxvidcore wrapper) for xine - * - * by Tomas Kovar <tomask@mac.com> - * with ideas from the ffmpeg xine plugin. - * - * Requires the xvidcore library. Find it at http://www.xvid.org. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <stdlib.h> -#include <pthread.h> -#include <xvid.h> - -#define LOG_MODULE "xvid_decoder" -#define LOG_VERBOSE -/* -#define LOG -*/ - -#include "bswap.h" -#include "xine_internal.h" -#include "buffer.h" -#include "xine-utils/xineutils.h" - -#define VIDEOBUFSIZE 128 * 1024 - -typedef struct xvid_decoder_s { - video_decoder_t video_decoder; - - vo_instance_t *video_out; - int decoder_running; - int skip_frames; - - unsigned char *buffer; - int buffer_size; - int frame_size; - - int frame_width; - int frame_height; - double ratio; - - /* frame_duration a.k.a. video_step. It is one second metronom */ - /* ticks (90,000) divided by fps (provided by demuxer from system */ - /* stream), i.e. for how many ticks the frame will be displayed */ - int frame_duration; - - void *xvid_handle; -} xvid_decoder_t; - -static void xvid_init_plugin (video_decoder_t *this_gen, vo_instance_t *video_out) { - xvid_decoder_t *this = (xvid_decoder_t *) this_gen; - - this->video_out = video_out; - this->decoder_running = 0; - this->buffer = NULL; - this->xvid_handle = NULL; -} - -static void xvid_decode_data (video_decoder_t *this_gen, buf_element_t *buf) { - int xerr; - xvid_decoder_t *this = (xvid_decoder_t *) this_gen; - - lprintf ("processing packet type = %08x, buf: %08x, buf->decoder_flags=%08x\n", - buf->type, buf, buf->decoder_flags); - - if (buf->decoder_flags & BUF_FLAG_FRAMERATE) { - this->frame_duration = buf->decoder_info[0]; - _x_stream_info_set(this->stream, XINE_STREAM_INFO_FRAME_DURATION, - this->video_step); - } - - if (buf->decoder_flags & BUF_FLAG_STDHEADER) { - xine_bmiheader *bih; - XVID_DEC_PARAM xparam; - - /* initialize data describing video stream */ - bih = (xine_bmiheader *) buf->content; - this->frame_width = bih->biWidth; - this->frame_height = bih->biHeight; - this->ratio = (double)bih->biWidth/(double)bih->biHeight; - - /* initialize decoder */ - if (this->xvid_handle) { - xvid_decore (this->xvid_handle, XVID_DEC_DESTROY, NULL, NULL); - this->xvid_handle = NULL; - } - - xparam.width = this->frame_width; - xparam.height = this->frame_height; - xparam.handle = NULL; - if ((xerr = xvid_decore (NULL, XVID_DEC_CREATE, &xparam, NULL)) == XVID_ERR_OK) { - this->xvid_handle = xparam.handle; - - /* initialize video out */ - this->video_out->open (this->video_out); - - /* initialize buffer */ - if (this->buffer) { - free (this->buffer); - } - - this->buffer = malloc (VIDEOBUFSIZE); - this->buffer_size = VIDEOBUFSIZE; - - this->decoder_running = 1; - this->skip_frames = 0; - printf ("xvid: WARNING: using libxvidcore.so to decode video. some versions of\n" - " this library have been reported to cause segmentation faults.\n" ); - } else { - printf ("xvid: cannot initialize xvid decoder, error = %d.\n", xerr); - return; - } - - } else { - if (this->decoder_running) { - - /* collect all video stream fragments until "end of frame" mark */ - if (this->frame_size + buf->size > this->buffer_size) { - this->buffer_size = this->frame_size + 2 * buf->size; - printf ("xvid: increasing source buffer to %d to avoid overflow.\n", this->buffer_size); - this->buffer = realloc (this->buffer, this->buffer_size); - } - - xine_fast_memcpy (&this->buffer[this->frame_size], buf->content, buf->size); - this->frame_size += buf->size; - - /* after collecting complete frame, decode it and schedule to display it */ - if (buf->decoder_flags & BUF_FLAG_FRAME_END) { - vo_frame_t *image; - XVID_DEC_FRAME xframe; - - image = this->video_out->get_frame (this->video_out, - this->frame_width, this->frame_height, - this->ratio, - XINE_IMGFMT_YV12, VO_BOTH_FIELDS); - image->pts = buf->pts; - image->duration = this->frame_duration; - image->bad_frame = 0; - - /* decode frame */ - xframe.bitstream = this->buffer; - xframe.length = this->frame_size; - /* FIXME: This assumes, that YV12 planes are correctly laid off */ - xframe.image = image->base[0]; - xframe.stride = this->frame_width; - xframe.colorspace = XVID_CSP_YV12; - - if ((xerr = xvid_decore (this->xvid_handle, XVID_DEC_DECODE, &xframe, NULL)) != XVID_ERR_OK - || this->skip_frames) { - if (this->skip_frames) { - printf ("xvid: skipping frame.\n"); - } else { - printf ("xvid: error decompressing frame, error code = %d.\n", xerr); - } - image->bad_frame = 1; - } - - /* add frame to display queue */ - this->skip_frames = image->draw (image); - if (this->skip_frames < 0) { - this->skip_frames = 0; - } - - image->free (image); - this->frame_size = 0; - } - } - } -} - -static void xvid_flush (video_decoder_t *this_gen) { -} - -static void xvid_close_plugin (video_decoder_t *this_gen) { - xvid_decoder_t *this = (xvid_decoder_t *) this_gen; - - if (this->decoder_running) { - xvid_decore (this->xvid_handle, XVID_DEC_DESTROY, NULL, NULL); - this->xvid_handle = NULL; - this->video_out->close (this->video_out); - this->decoder_running = 0; - } - if (this->buffer) { - free (this->buffer); - this->buffer = NULL; - } -} - -static char *xvid_get_id(void) { - return "XviD video decoder"; -} - -static void xvid_dispose (video_decoder_t *this_gen) { - free (this_gen); -} - -static void *init_video_decoder_plugin (xine_t *xine, void *data) { - xvid_decoder_t *this; - XVID_INIT_PARAM xinit; - - xinit.cpu_flags = 0; - xvid_init(NULL, 0, &xinit, NULL); - if (xinit.api_version != API_VERSION) { - printf (_("xvid: there is mismatch between API used by currently installed XviD\n" - "xvid: library (%d.%d) and library used to compile this plugin (%d.%d).\n" - "xvid: Compiling this plugin against current XviD library should help.\n"), - xinit.api_version >> 16, xinit.api_version & 0xFFFF, - API_VERSION >> 16, API_VERSION & 0xFFFF); - return NULL; - } - - this = (xvid_decoder_t *) xine_xmalloc (sizeof (xvid_decoder_t)); - - this->video_decoder.init = xvid_init_plugin; - this->video_decoder.decode_data = xvid_decode_data; - this->video_decoder.flush = xvid_flush; - this->video_decoder.close = xvid_close_plugin; - this->video_decoder.get_identifier = xvid_get_id; - this->video_decoder.dispose = xvid_dispose; - this->frame_size = 0; - - return (video_decoder_t *) this; -} - -/* - * exported plugin catalog entry - */ - -static uint32_t video_types[] = { - BUF_VIDEO_XVID, - 0 - }; - -static decoder_info_t dec_info_video = { - video_types, /* supported types */ - 3 /* priority */ -}; - -static uint32_t video_types2[] = { - BUF_VIDEO_DIVX5, - 0 - }; - -static decoder_info_t dec_info_video2 = { - video_types2, /* supported types */ - 10 /* priority */ -}; - -plugin_info_t xine_plugin_info[] = { - /* type, API, "name", version, special_info, init_function */ - { PLUGIN_VIDEO_DECODER, 10, "xvid", XINE_VERSION_CODE, &dec_info_video, init_video_decoder_plugin }, - { PLUGIN_VIDEO_DECODER, 10, "xvid-divx5", XINE_VERSION_CODE, &dec_info_video2, init_video_decoder_plugin }, - { PLUGIN_NONE, 0, "", 0, NULL, NULL } -}; |