diff options
Diffstat (limited to 'src/libreal/xine_real_video_decoder.c')
-rw-r--r-- | src/libreal/xine_real_video_decoder.c | 94 |
1 files changed, 47 insertions, 47 deletions
diff --git a/src/libreal/xine_real_video_decoder.c b/src/libreal/xine_real_video_decoder.c index 314edc489..4977ee889 100644 --- a/src/libreal/xine_real_video_decoder.c +++ b/src/libreal/xine_real_video_decoder.c @@ -1,25 +1,25 @@ /* * Copyright (C) 2000-2008 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA * * thin layer to use real binary-only codecs in xine * - * code inspired by work from Florian Schneider for the MPlayer Project + * code inspired by work from Florian Schneider for the MPlayer Project */ #ifdef HAVE_CONFIG_H @@ -149,12 +149,12 @@ static int load_syms_linux (realdec_decoder_t *this, const char *codec_name, con this->rvyuv_hive_message = dlsym (this->rv_handle, "RV20toYUV420HiveMessage"); this->rvyuv_init = dlsym (this->rv_handle, "RV20toYUV420Init"); this->rvyuv_transform = dlsym (this->rv_handle, "RV20toYUV420Transform"); - + if (this->rvyuv_custom_message && this->rvyuv_free && this->rvyuv_hive_message && this->rvyuv_init && - this->rvyuv_transform) + this->rvyuv_transform) return 1; this->rvyuv_custom_message = dlsym (this->rv_handle, "RV40toYUV420CustomMessage"); @@ -162,15 +162,15 @@ static int load_syms_linux (realdec_decoder_t *this, const char *codec_name, con this->rvyuv_hive_message = dlsym (this->rv_handle, "RV40toYUV420HiveMessage"); this->rvyuv_init = dlsym (this->rv_handle, "RV40toYUV420Init"); this->rvyuv_transform = dlsym (this->rv_handle, "RV40toYUV420Transform"); - + if (this->rvyuv_custom_message && this->rvyuv_free && this->rvyuv_hive_message && this->rvyuv_init && - this->rvyuv_transform) + this->rvyuv_transform) return 1; - xprintf (this->stream->xine, XINE_VERBOSITY_LOG, + xprintf (this->stream->xine, XINE_VERBOSITY_LOG, _("libreal: Error resolving symbols! (version incompatibility?)\n")); return 0; } @@ -198,17 +198,17 @@ static int init_codec (realdec_decoder_t *this, buf_element_t *buf) { return 0; break; default: - xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG, + xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG, "libreal: error, i don't handle buf type 0x%08x\n", buf->type); _x_abort(); } init_data.w = _X_BE_16(&buf->content[12]); init_data.h = _X_BE_16(&buf->content[14]); - + this->width = (init_data.w + 1) & (~1); this->height = (init_data.h + 1) & (~1); - + if(buf->decoder_flags & BUF_FLAG_ASPECT) this->ratio = (double)buf->decoder_info[1] / (double)buf->decoder_info[2]; else @@ -216,15 +216,15 @@ static int init_codec (realdec_decoder_t *this, buf_element_t *buf) { /* While the framerate is stored in the header it sometimes doesn't bear * much resemblence to the actual frequency of frames in the file. Hence - * it's better to just let the engine estimate the frame duration for us */ + * it's better to just let the engine estimate the frame duration for us */ #if 0 - this->fps = (double) _X_BE_16(&buf->content[22]) + + this->fps = (double) _X_BE_16(&buf->content[22]) + ((double) _X_BE_16(&buf->content[24]) / 65536.0); this->duration = 90000.0 / this->fps; #endif - + lprintf("this->ratio=%f\n", this->ratio); - + lprintf ("init_data.w=%d(0x%x), init_data.h=%d(0x%x)," "this->width=%d(0x%x), this->height=%d(0x%x)\n", init_data.w, init_data.w, @@ -238,22 +238,22 @@ static int init_codec (realdec_decoder_t *this, buf_element_t *buf) { init_data.subformat = _X_BE_32(&buf->content[26]); init_data.format = _X_BE_32(&buf->content[30]); - + #ifdef LOG printf ("libreal: init_data for rvyuv_init:\n"); xine_hexdump ((char *) &init_data, sizeof (init_data)); - + printf ("libreal: buf->content\n"); xine_hexdump (buf->content, buf->size); -#endif - lprintf ("init codec %dx%d... %x %x\n", +#endif + lprintf ("init codec %dx%d... %x %x\n", init_data.w, init_data.h, init_data.subformat, init_data.format ); - + this->context = NULL; - - result = this->rvyuv_init (&init_data, &this->context); - + + result = this->rvyuv_init (&init_data, &this->context); + lprintf ("init result: %d\n", result); /* setup rv30 codec (codec sub-type and image dimensions): */ @@ -266,42 +266,42 @@ static int init_codec (realdec_decoder_t *this, buf_element_t *buf) { cmsg24[1] = this->height; for(i = 2, j = 34; j < buf->size; i++, j++) cmsg24[i] = 4 * buf->content[j]; - + #ifdef LOG printf ("libreal: CustomMessage cmsg_data:\n"); xine_hexdump ((uint8_t *) &cmsg_data, sizeof (cmsg_data)); printf ("libreal: cmsg24:\n"); xine_hexdump ((uint8_t *) cmsg24, (buf->size - 34 + 2) * sizeof(uint32_t)); #endif - + this->rvyuv_custom_message (&cmsg_data, this->context); } - + (this->stream->video_out->open) (this->stream->video_out, this->stream); - + this->frame_size = this->width * this->height; this->frame_buffer = xine_xmalloc (this->width * this->height * 3 / 2); - + this->chunk_buffer = calloc(1, BUF_SIZE); this->chunk_buffer_max = BUF_SIZE; - + return 1; } static void realdec_decode_data (video_decoder_t *this_gen, buf_element_t *buf) { realdec_decoder_t *this = (realdec_decoder_t *) this_gen; - lprintf ("decode_data, flags=0x%08x, len=%d, pts=%"PRId64" ...\n", + lprintf ("decode_data, flags=0x%08x, len=%d, pts=%"PRId64" ...\n", buf->decoder_flags, buf->size, buf->pts); if (buf->decoder_flags & BUF_FLAG_PREVIEW) { /* real_find_sequence_header (&this->real, buf->content, buf->content + buf->size);*/ return; } - + if (buf->decoder_flags & BUF_FLAG_FRAMERATE) { this->duration = buf->decoder_info[0]; - _x_stream_info_set(this->stream, XINE_STREAM_INFO_FRAME_DURATION, + _x_stream_info_set(this->stream, XINE_STREAM_INFO_FRAME_DURATION, this->duration); } @@ -312,14 +312,14 @@ static void realdec_decode_data (video_decoder_t *this_gen, buf_element_t *buf) _x_stream_info_set(this->stream, XINE_STREAM_INFO_VIDEO_HANDLED, 0); } else if (this->decoder_ok && this->context) { - + /* Each frame starts with BUF_FLAG_FRAME_START and ends with * BUF_FLAG_FRAME_END. * The last buffer contains the chunk offset table. */ if (!(buf->decoder_flags & BUF_FLAG_SPECIAL)) { - + lprintf ("buffer (%d bytes)\n", buf->size); if (buf->decoder_flags & BUF_FLAG_FRAME_START) { @@ -329,10 +329,10 @@ static void realdec_decode_data (video_decoder_t *this_gen, buf_element_t *buf) this->pts = buf->pts; lprintf ("new frame starting, pts=%"PRId64"\n", this->pts); } - + if ((this->chunk_buffer_size + buf->size) > this->chunk_buffer_max) { lprintf("increasing chunk buffer size\n"); - + this->chunk_buffer_max *= 2; this->chunk_buffer = realloc(this->chunk_buffer, this->chunk_buffer_max); } @@ -345,9 +345,9 @@ static void realdec_decode_data (video_decoder_t *this_gen, buf_element_t *buf) } else { /* end of frame, chunk table */ - + lprintf ("special buffer (%d bytes)\n", buf->size); - + if (buf->decoder_info[1] == BUF_SPECIAL_RV_CHUNK_TABLE) { int result; @@ -383,7 +383,7 @@ static void realdec_decode_data (video_decoder_t *this_gen, buf_element_t *buf) xine_hexdump ((uint8_t *) &transform_in, sizeof(rv_xform_in_t)); printf ("libreal: chunk_table:\n"); - xine_hexdump ((uint8_t *) buf->decoder_info_ptr[2], + xine_hexdump ((uint8_t *) buf->decoder_info_ptr[2], 2*(buf->decoder_info[2]+1)*sizeof(uint32_t)); #endif @@ -458,13 +458,13 @@ static void realdec_flush (video_decoder_t *this_gen) { static void realdec_reset (video_decoder_t *this_gen) { realdec_decoder_t *this = (realdec_decoder_t *) this_gen; - + this->chunk_buffer_size = 0; } static void realdec_discontinuity (video_decoder_t *this_gen) { realdec_decoder_t *this = (realdec_decoder_t *) this_gen; - + this->pts = 0; } @@ -480,21 +480,21 @@ static void realdec_dispose (video_decoder_t *this_gen) { if (this->rvyuv_free && this->context) this->rvyuv_free (this->context); - if (this->rv_handle) + if (this->rv_handle) dlclose (this->rv_handle); if (this->frame_buffer) free (this->frame_buffer); - + if (this->chunk_buffer) free (this->chunk_buffer); - + free (this); lprintf ("dispose done\n"); } -static video_decoder_t *open_plugin (video_decoder_class_t *class_gen, +static video_decoder_t *open_plugin (video_decoder_class_t *class_gen, xine_stream_t *stream) { real_class_t *cls = (real_class_t *) class_gen; |