/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /*************************************************************************** * player.cc * * Mon Mar 6 20:14:25 CET 2006 * Copyright 2006 Bent Bisballe Nyeng * deva@aasimon.org ****************************************************************************/ /* * This file is part of MIaV. * * MIaV 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. * * MIaV 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 MIaV; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #include "player.h" #define WIDTH 720 #define HEIGHT 576 //#define COLORSPACE_YV12 static int num = 0; static bool first = true; Player::Player(QWidget *w, Decoder *d) { widget = w; decoder = d; render.init(widget, WIDTH, HEIGHT); connect(this, SIGNAL(timeout()), this, SLOT(show_frame())); dvdecoder = dv_decoder_new(FALSE/*this value is unused*/, FALSE, FALSE); dv_set_quality(dvdecoder, DV_QUALITY_COLOR | DV_QUALITY_AC_1); //dv_set_quality(dvdecoder, DV_QUALITY_BEST); } Player::~Player() { render.end(); } void Player::show_frame() { Frame *frame; fprintf(stderr, "Frame!%d\n", num++); frame = decoder->getFrame(); if(!frame) return; if(first) { #ifdef COLORSPACE_YV12 yuv[0] = (unsigned char*)render.xvimage->data; yuv[1] = (unsigned char*)yuv[0] + (WIDTH * HEIGHT); yuv[2] = (unsigned char*)yuv[1] + (WIDTH * HEIGHT / 4); pitches[0] = WIDTH; pitches[1] = WIDTH / 2; pitches[2] = WIDTH / 2; #else yuv[0] = (unsigned char*)render.getDisplayData(); // Decode directly to the XVideo buffer pitches[0] = WIDTH * 2; #endif dv_parse_header(dvdecoder, frame->data); //dv_parse_packs(decoder, frame->data); // Not needed anyway! dvdecoder->system = e_dv_system_625_50; // PAL lines, PAL framerate dvdecoder->sampling = e_dv_sample_422; // 4 bytes y, 2 bytes u, 2 bytes v dvdecoder->std = e_dv_std_iec_61834; dvdecoder->num_dif_seqs = 12; first = false; } dv_decode_full_frame(dvdecoder, frame->data, e_dv_color_yuv, yuv, pitches); render.width = widget->width(); render.height = widget->height(); render.display(WIDTH, HEIGHT); }