summaryrefslogtreecommitdiff
path: root/player-image.h
blob: 6a784debf87d798d571995686f32a0f3457e5a94 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/*
 * Image plugin to VDR (C++)
 *
 * (C) 2004 Andreas Brachold    <vdr04-at-deltab.de>
 *     2003 Kai Tobias Burwieck <kai@burwieck.net>
 *
 * This code 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.
 *
 * This code 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.
 * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
 */

#ifndef ___DVB_IMAGE_H
#define ___DVB_IMAGE_H

#include <vector>
#define __STL_CONFIG_H

#include <vdr/thread.h>
#include <vdr/player.h>
#include <liboutput/stillimage-player.h>

class cImage;
class cSlideShow;    

struct cShellWrapper {
    
  char* szCmd;
  char* szPNM;
  char  szNumber;
  bool bClearBackground;
  unsigned int nOffLeft;
  unsigned int nOffTop;
  unsigned int nWidth;
  unsigned int nHeight;

  cShellWrapper()
  : szCmd(NULL)
  , szPNM(NULL)
  , szNumber('\0')
  {
  }

  virtual ~cShellWrapper() {
    if(szPNM)
      free(szPNM);
    if(szCmd)
      free(szCmd);
  }
};

struct cShellWrapperQueue
 : public std::vector<cShellWrapper*>
{
  virtual ~cShellWrapperQueue()
  {
    iterator i = begin();
    const_iterator e = end();
    for(;e!=i;++i)
        delete(*i);
    clear();
  }

  inline size_t max_size() const 
  {
    return 64;
  }

  inline bool add(cShellWrapper* pCmd) {
    if(size()<max_size())
    {
      if(NULL == pCmd->szPNM || !pCmd->bClearBackground) //Pregeneration or Index
        push_back(pCmd);
      else { 
        // Remove all other viewed images from queue
        iterator i = begin();
        while(end()!=i) {
          if((*i)->szPNM) {
            delete(*i);
            erase(i);
            }
          else
            ++i;
          }
        //Place next viewed image at front of the queue
        insert(begin(),pCmd);
      }
      return true;
    }  
    return false;
  }
  
};

class cImagePlayer
: public cStillImagePlayer
{
    
  volatile bool               m_bConvertRunning;

  cMutex                      m_Mutex;
  cShellWrapperQueue          m_queue;
  cMutex                      m_MutexErr;
  char*                       m_szError;
protected:
  void Exec(cShellWrapper* pCmd);

  void LoadImage(cShellWrapper* pShell);
  /** Show Errorimage if operation failed*/
  void ExecFailed(cShellWrapper* pShell,const char* szErr);

  virtual void Activate(bool On);
  virtual bool Worker(bool bDoIt);
public:

  cImagePlayer(cSlideShow *pCurSlideShow);
  virtual ~ cImagePlayer();
  bool IsConvertRunning() const { return m_bConvertRunning; };
  bool NextImage(int Step);
  bool PrevImage(int Step);
  bool GotoImage(unsigned int nNewPictureIndex);
  
  /** Deliver the filename from the current number of viewed Image */
  const char* FileName(void) const;

  bool Convert(const char *szChange);
  bool ConvertZoom(const char *szChange, int nZoomFaktor,
			       int nLeftPos, int nTopPos);
  bool ConvertJump(int Step);
  
  /** Returns the current and total frame index, optionally snapped to the
  nearest I-frame.*/
  virtual bool GetIndex(int &Current, int &Total, bool SnapToIFrame);
  /** ThreadSafe Method to show messages from Worker thread*/
  void ErrorMsg();
};

#endif				//__DVB_IMAGE_H