summaryrefslogtreecommitdiff
path: root/frontend_local.c
diff options
context:
space:
mode:
Diffstat (limited to 'frontend_local.c')
-rw-r--r--frontend_local.c462
1 files changed, 0 insertions, 462 deletions
diff --git a/frontend_local.c b/frontend_local.c
deleted file mode 100644
index dbf9a617..00000000
--- a/frontend_local.c
+++ /dev/null
@@ -1,462 +0,0 @@
-/*
- * frontend_local.c:
- *
- * See the main source file 'xineliboutput.c' for copyright information and
- * how to reach the author.
- *
- * $Id: frontend_local.c,v 1.43 2009-08-18 12:51:42 phintuka Exp $
- *
- */
-
-#define __STDC_CONSTANT_MACROS
-
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <dlfcn.h>
-
-#include <vdr/config.h>
-#include <vdr/tools.h>
-#include <vdr/shutdown.h>
-#include <vdr/plugin.h>
-
-#include "logdefs.h"
-#include "config.h"
-
-#include "xine_frontend.h"
-
-#include "frontend_local.h"
-
-//------------------------------ cRwLockBlock ---------------------------------
-
-class cRwLockBlock
-{
- private:
- cRwLock& m_Lock;
-
- public:
- cRwLockBlock(cRwLock& lock, bool write) : m_Lock(lock)
- { m_Lock.Lock(write);}
-
- ~cRwLockBlock()
- { m_Lock.Unlock(); }
-};
-
-#define LOCK_FE cRwLockBlock(m_feLock, false)
-#define LOCK_FE_WR cRwLockBlock(m_feLock, true)
-
-//----------------- keyboard control handler (C callback) --------------------
-
-extern "C" {
- static void keypress_handler(const char *keymap, const char *key)
- {
- if(!strncmp("INFO ", keymap, 5)) {
-
- cXinelibThread::InfoHandler(keymap+5);
-
- } else if(!xc.use_x_keyboard || !key) {
-
- /* Only X11 key events came this way in local mode.
- Keyboard is handled by vdr. */
- LOGMSG("keypress_handler(%s): X11 Keyboard disabled in config", key);
-
- } else {
-
- cXinelibThread::KeypressHandler(keymap, key, false, false);
-
- }
- }
-};
-
-//----------------------------- cXinelibLocal --------------------------------
-
-cXinelibLocal::cXinelibLocal(const char *frontend_name) :
- cXinelibThread("Local decoder/display (cXinelibThread)"), m_feLock(true)
-{
- fe = NULL;
- h_fe_lib = NULL;
- m_bReconfigRequest = true;
-
- if (!xc.config_file &&
- 0 < asprintf(&xc.config_file,
- "%s/xineliboutput/config",
- cPlugin::ConfigDirectory()))
- LOGMSG("cXinelibLocal: Using xine-lib configuration file %s", xc.config_file);
-}
-
-cXinelibLocal::~cXinelibLocal()
-{
- TRACEF("cXinelibLocal::~cXinelibLocal");
-
- m_bReady = false;
-
- Cancel(-1);
-
- {
- LOCK_FE;
- m_bReady = false;
- if(fe)
- fe->fe_interrupt(fe);
- }
-
- Cancel(3);
-
- if (fe) {
- fe->fe_free(fe);
- fe = NULL;
- }
- if (h_fe_lib) {
- dlclose(h_fe_lib);
- }
-}
-
-//
-// Data transfer
-//
-
-int cXinelibLocal::Play_PES(const uchar *data, int len)
-{
- TRACEF("cXinelibLocal::Play_PES");
-
- {
- LOCK_FE;
- if (fe && Running()) {
- int done = fe->xine_queue_pes_packet(fe, (char*)data, len);
- if (done >= 0) {
- Lock();
- m_StreamPos += done;
- Unlock();
- return done;
- }
- }
- }
-
- //cCondWait::SleepMs(5);
- return len;
-}
-
-void cXinelibLocal::OsdCmd(void *cmd)
-{
- TRACEF("cXinelibLocal::OsdCmd");
- LOCK_FE;
- if(cmd && fe && m_bReady)
- fe->xine_osd_command(fe, (struct osd_command_s*)cmd);
-}
-
-uchar *cXinelibLocal::GrabImage(int &Size, bool Jpeg,
- int Quality, int SizeX,
- int SizeY)
-{
- uchar *data;
- LOCK_FE;
- if(fe && fe->grab && m_bReady)
- if((data = (uchar*)fe->grab(fe, &Size, Jpeg, Quality, SizeX, SizeY)))
- return data;
- return NULL;
-}
-
-int64_t cXinelibLocal::GetSTC()
-{
- TRACEF("cXinelibLocal::GetSTC");
-
- union {
- char buf[32];
- int64_t pts;
- } u = {"GETSTC\r\n"};
-
- LOCK_FE;
-
- if (fe && m_bReady)
- if (0 == fe->xine_control(fe, u.buf))
- return u.pts;
-
- return INT64_C(-1);
-}
-
-//
-// Playback files
-//
-
-bool cXinelibLocal::EndOfStreamReached(void)
-{
- LOCK_THREAD;
- if(fe && fe->xine_is_finished(fe, 1))
- return true;
- return cXinelibThread::EndOfStreamReached();
-}
-
-//
-// Configuration
-//
-
-void cXinelibLocal::ConfigureWindow(int fullscreen, int width, int height,
- int modeswitch, const char *modeline,
- int aspect, int scale_video,
- int field_order)
-{
- LOCK_FE;
- if(fe)
- fe->fe_display_config(fe, -1, -1, width, height,
- fullscreen, modeswitch, modeline,
- aspect, scale_video, field_order);
-}
-
-void cXinelibLocal::ConfigureDecoder(int pes_buffers)
-{
- // needs xine restart
- {
- LOCK_FE;
- xc.pes_buffers = pes_buffers;
- if(!fe)
- return;
- m_bReady = false;
- m_bReconfigRequest = true;
- fe->fe_interrupt(fe);
- }
-
- while (!m_bReady && Running())
- cCondWait::SleepMs(100);
-
- cCondWait::SleepMs(100);
-}
-
-//
-// Xine control
-//
-
-int cXinelibLocal::Xine_Control(const char *cmd)
-{
- TRACEF("cXinelibLocal::Xine_Control");
- if (cmd && *cmd && Running()) {
- char buf[4096];
- if(snprintf(buf, sizeof(buf), "%s\r\n", cmd) >= (int)sizeof(buf)) {
- buf[sizeof(buf)-1] = 0;
- LOGMSG("Xine_Control: message too long ! (%s)", buf);
- return 0;
- }
- LOCK_FE;
- if(fe)
- return fe->xine_control(fe, (char*)buf);
- }
- return 0;
-}
-
-//
-// Frontend loader
-//
-
-frontend_t *cXinelibLocal::load_frontend(const char *fe_name)
-{
- Dl_info info;
- struct stat statbuffer;
- char libname[4096]="";
- void *lib = NULL;
- fe_creator_f *fe_creator = NULL;
- static int my_marker = 0;
-
- if(!dladdr((void *)&my_marker, &info)) {
- LOGERR("Error searching plugin: dladdr() returned false (%s)",dlerror());
- return NULL;
- }
- LOGDBG("xineliboutput: plugin file is %s", info.dli_fname);
-
- int fe_ind = strstra(fe_name, xc.s_frontends, FRONTEND_NONE);
- bool fe_try = false;
- if(fe_ind == FRONTEND_NONE) {
- LOGMSG("Front-end %s unknown!", fe_name);
- fe_ind = 0;
- fe_try = true;
- }
-
- strn0cpy(libname, info.dli_fname, sizeof(libname) - 128);
- if(strrchr(libname, '/'))
- *(strrchr(libname, '/')+1) = 0;
-
- LOGDBG("Searching frontend %s from %s", xc.s_frontends[fe_ind], libname);
-
- do {
- strncat(libname, xc.s_frontend_files[fe_ind], 64);
- LOGDBG("Probing %s", libname);
-
- if (stat(libname, &statbuffer)) {
- LOGERR("load_frontend: can't stat %s",libname);
- } else if((statbuffer.st_mode & S_IFMT) != S_IFREG) {
- LOGMSG("load_frontend: %s not regular file ! trying to load anyway ...",
- libname);
- }
-
- if( !(lib = dlopen (libname, RTLD_LAZY | RTLD_GLOBAL))) {
- char *dl_error_msg = dlerror();
- LOGERR("load_frontend: cannot dlopen file %s: %s",
- libname, dl_error_msg);
- } else if ( (fe_creator = (fe_creator_f*)dlsym(lib, "fe_creator"))) {
- LOGDBG("load_frontend: entry at %p", fe_creator);
- frontend_t *fe = (**fe_creator)();
-
- if(fe) {
- if(h_fe_lib)
- dlclose(h_fe_lib);
- h_fe_lib = lib;
-
- LOGDBG("Using frontend %s (%s) from %s",
- xc.s_frontends[fe_ind], xc.s_frontendNames[fe_ind],
- xc.s_frontend_files[fe_ind]);
-
- return fe;
- } else {
- LOGMSG("Frontend %s (%s) creation failed",
- xc.s_frontends[fe_ind], xc.s_frontendNames[fe_ind]);
- }
- } else {
- LOGERR("Frontend entry point not found");
- dlclose(lib);
- }
-
- fe_ind++; // try next frontend ...
-
- } while(fe_try && fe_ind < FRONTEND_count);
-
- LOGMSG("No usable frontends found, giving up !");
- return NULL;
-}
-
-//
-// Thread main loop
-//
-
-void cXinelibLocal::Action(void)
-{
- frontend_t *curr_fe = NULL;
-
- TRACEF("cXinelibLocal::Action");
-
- SetPriority(2); /* lower priority */
-
- // init frontend
- if(!curr_fe) {
- curr_fe = load_frontend(xc.local_frontend);
- if(!curr_fe) {
- LOGMSG("cXinelibLocal: Error initializing frontend");
- Cancel(-1);
- } else {
- LOGDBG("cXinelibLocal::Action - fe created");
- if(!curr_fe->fe_display_open(curr_fe, 0, 0, xc.width, xc.height, xc.fullscreen, xc.hud_osd,
- xc.modeswitch, xc.modeline, xc.display_aspect,
- keypress_handler, 0/*no_x_kbd*/, 0/*gui_hotkeys*/,
- xc.video_port,
- xc.scale_video,
- xc.field_order,
- NULL, -1)) {
- LOGMSG("cXinelibLocal: Error initializing display");
- Cancel(-1);
- } else {
- LOGDBG("cXinelibLocal::Action - fe->fe_display_open ok");
- }
- }
- }
-
- // main loop
- while (Running()) {
-
- {
- // init and start xine engine
- LOCK_FE_WR;
- LOGDBG("cXinelibLocal::Action - xine_init");
-
- fe = curr_fe;
- if(m_bReconfigRequest) {
- if(!fe->xine_init(fe, xc.audio_driver, xc.audio_port,
- xc.video_driver,
- xc.pes_buffers,
- xc.post_plugins, xc.config_file)) {
- LOGMSG("cXinelibLocal: Error initializing frontend");
- break;
- }
- LOGDBG("cXinelibLocal::Action - fe->xine_init ok");
- m_bReconfigRequest = false;
- }
-
- // open (xine) stream
- LOGDBG("cXinelibLocal::Action - xine_open");
- if(!fe->xine_open(fe, NULL)) {
- LOGMSG("cXinelibLocal: Error opening xvdr://");
- break;
- }
- LOGDBG("cXinelibLocal::Action - fe->xine_open ok");
-
- // start playing (xine) stream
- if(!fe->xine_play(fe)) {
- LOGMSG("cXinelibLocal: Error playing xvdr://");
- break;
- }
- LOGDBG("cXinelibLocal::Action - fe->xine_play ok");
-
- m_StreamPos = 0;
- Xine_Control("STREAMPOS 0");
- Xine_Control("VERSION " XINELIBOUTPUT_VERSION " " "\r\n");
- }
-
- // configure frontend and xine
- m_bNoVideo = false;
- Configure();
- LOGDBG("cXinelibLocal::Action - fe config OK");
-
- LogoDisplay();
- LOGDBG("cXinelibLocal::Action - logo sent");
-
- {
- LOCK_THREAD;
- Xine_Control("NOVIDEO 0");
- Xine_Control("LIVE 1");
- Xine_Control("CLEAR");
- m_bNoVideo = false;
- m_bLiveMode = true;
- m_bReady = true;
- }
-
- // main event loop
- LOGDBG("cXinelibLocal:Action - Starting event loop");
- {
- LOCK_FE;
- while (Running() && m_bReady &&
- (/*m_bLoopPlay ||*/ !fe->xine_is_finished(fe, 0)) &&
- fe->fe_run(fe))
- /*cCondWait::SleepMs(50)*/ ;
- }
-
- LOGDBG("cXinelibLocal::Action - event loop terminated, "
- "xine_is_finished=%d", fe->xine_is_finished(fe, 0));
-
- {
- LOCK_THREAD;
- m_bReady = false;
- m_bEndOfStreamReached = true;
- }
-
- {
- LOCK_FE_WR;
- if(fe)
- fe->xine_close(fe);
- fe = NULL;
- }
-
- LOGMSG("cXinelibLocal::Action: Xine closed");
-
- if(!m_bReconfigRequest && xc.exit_on_close) {
- LOGMSG("Shutting down VDR");
- ShutdownHandler.RequestEmergencyExit();
- break;
- }
- }
-
- if(curr_fe) {
- curr_fe->xine_exit(fe);
- curr_fe->fe_display_close(curr_fe);
- curr_fe->fe_free(curr_fe);
- }
-
- LOGMSG("cXinelibLocal::Action: thread finished");
-}
-