summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLarsAC <LarsAC@e10066b5-e1e2-0310-b819-94efdf66514b>2005-10-09 11:05:01 +0000
committerLarsAC <LarsAC@e10066b5-e1e2-0310-b819-94efdf66514b>2005-10-09 11:05:01 +0000
commitc0e5840cbe5d9099d3f3a88b92c20d5100b91db2 (patch)
tree37b89837d6cbffef7ea229e56784b15cd35084fd
parent2b11e1237021b24a19ad765666ed9b51285b359c (diff)
downloadvdr-plugin-muggle-c0e5840cbe5d9099d3f3a88b92c20d5100b91db2.tar.gz
vdr-plugin-muggle-c0e5840cbe5d9099d3f3a88b92c20d5100b91db2.tar.bz2
Remove several bugs in image display code
git-svn-id: https://vdr-muggle.svn.sourceforge.net/svnroot/vdr-muggle/trunk/muggle-plugin@878 e10066b5-e1e2-0310-b819-94efdf66514b
-rw-r--r--mg_image_provider.c95
-rw-r--r--mg_image_provider.h13
-rw-r--r--vdr_player.c12
3 files changed, 62 insertions, 58 deletions
diff --git a/mg_image_provider.c b/mg_image_provider.c
index 7b46d52..a9418f3 100644
--- a/mg_image_provider.c
+++ b/mg_image_provider.c
@@ -95,6 +95,11 @@ mgImageProvider::mgImageProvider( )
mgImageProvider::~mgImageProvider()
{
+ deleteTemporaryImages();
+}
+
+void mgImageProvider::deleteTemporaryImages()
+{
if( m_delete_imgs_from_tag )
{
for( vector<string>::iterator iter = m_image_list.begin(); iter != m_image_list.end(); iter ++ )
@@ -104,12 +109,14 @@ mgImageProvider::~mgImageProvider()
}
m_delete_imgs_from_tag = false;
}
-
+ m_image_list.clear();
+
for( vector<string>::iterator iter = m_converted_images.begin(); iter != m_converted_images.end(); iter ++ )
{
// remove( (*iter).c_str() );
cout << "Removing " << *iter << endl;
}
+ m_converted_images.clear();
}
mgImageProvider* mgImageProvider::Create( string dir )
@@ -122,6 +129,31 @@ mgImageProvider* mgImageProvider::Create( )
return new mgImageProvider();
}
+void mgImageProvider::updateFromItemDirectory( mgItemGd *item )
+{
+ // no images in tags, find images in the directory of the file itself
+ string dir = dirname( (char *) (item->getSourceFile().c_str()) );
+
+ // do something, when there are no images here, either:
+ // simply go up one step in the directory hierarchy, until we reach top level directory
+ bool toplevel_reached = false;
+ while( !m_image_list.size() && !toplevel_reached )
+ {
+ if( samedir( dir.c_str(), the_setup.ToplevelDir ) )
+ {
+ toplevel_reached = true;
+ }
+
+ fillImageList( dir );
+
+ if( !m_image_list.size() )
+ {
+ // nothing found, turn up one directory level
+ dir = dirname( (char *)dir.c_str() );
+ }
+ }
+}
+
bool mgImageProvider::updateItem( mgItemGd *item )
{
// clean up stuff from previous item ?
@@ -129,69 +161,24 @@ bool mgImageProvider::updateItem( mgItemGd *item )
string filename = item->getSourceFile();
if( m_mode == IM_ITEM_DIR )
- {
- // do not try to acquire new images when we are playing back a separate directory
-
- if( m_delete_imgs_from_tag )
- {
- for( vector<string>::iterator iter = m_image_list.begin(); iter != m_image_list.end(); iter ++ )
- {
- // remove( (*iter).c_str() );
- cout << "Removing " << *iter << endl;
- }
- m_delete_imgs_from_tag = false;
- }
- m_image_list.clear();
-
- for( vector<string>::iterator iter = m_converted_images.begin(); iter != m_converted_images.end(); iter ++ )
- {
- // remove( (*iter).c_str() );
- cout << "Removing " << *iter << endl;
- }
- m_converted_images.clear();
- // clear temporary image directory
+ { // do not try to acquire new images when we are playing back a separate directory
+ deleteTemporaryImages();
// check whether the item has cover images in tags?
string dir = extractImagesFromTag( filename );
+
if( dir == "" )
{
- // no images in tags, find images in the directory of the file itself
- dir = dirname( (char *) (item->getSourceFile().c_str()) );
- cout << "No images in tags. Looking in " << dir << endl;
-
- // do something, when there are no images here, either:
- // simply go up one step in the directory hierarchy, until we reach top level directory
- bool toplevel_reached = false;
- while( !m_image_list.size() )
- {
- if( samedir( dir.c_str(), the_setup.ToplevelDir ) )
- {
- cout << "Toplevel reached at " << dir << endl;
- toplevel_reached = true;
- }
-
- fillImageList( dir );
- cout << "Images in " << dir << ": " << m_image_list.size() << endl;
-
- if( !m_image_list.size() )
- {
- cout << "Nothing found in " << dir << endl;
-
- // nothing found, turn up one directory level
- dir = dirname( (char *)dir.c_str() );
- cout << "Looking further in " << dir << endl;
- }
- }
- cout << "Finished." << endl;
+ updateFromItemDirectory( item );
}
else
{
fillImageList( dir );
}
- // start a thread to convert all images in 'dir into .mpg format in the background
+ // start a thread to convert all images in 'dir' into .mpg format in the background
Start();
-
+
m_image_index = 0;
}
// else: nothing todo when changing the item currently being played
@@ -227,7 +214,7 @@ void mgImageProvider::Action()
// assemble path from relative paths
string tmpFile = string( the_setup.ImageCacheDir ) + string( "/" ) + bname.substr( 0, dotpos ) + string( ".mpg" );
- cout << "Converting " << filename << " to " << tmpFile << endl << flush;
+ // cout << "Converting " << filename << " to " << tmpFile << endl << flush;
char *tmp;
asprintf( &tmp, "image_convert.sh \"%s\" \"%s\"", filename.c_str(), tmpFile.c_str() );
@@ -245,7 +232,7 @@ void mgImageProvider::Action()
// Check whether we need to continue this!? Next song may be playing already...
}
- cout << "Image conversion thread ending." << endl << flush;
+ // cout << "Image conversion thread ending." << endl << flush;
}
void mgImageProvider::fillImageList( string dir )
diff --git a/mg_image_provider.h b/mg_image_provider.h
index c5526bb..be6893a 100644
--- a/mg_image_provider.h
+++ b/mg_image_provider.h
@@ -54,13 +54,26 @@ class mgImageProvider : public cThread
*/
void fillImageList( std::string dir );
+ /*! \brief find images for an item
+ */
+ void updateFromItemDirectory( mgItemGd *item );
+
+ /*! \brief write image from an id3v2 frame to a file
+ */
void writeImage( TagLib::ByteVector &image, int num, std::string &image_cache );
+
+ /*! \brief convert all images found in the APIC frame list
+ */
std::string treatFrameList( TagLib::ID3v2::FrameList &l, std::string &image_cache );
/*! \brief save images from APIC tag and save to file. returns directory where images were saved or empty string if no images were found in the APIC tag
*/
std::string extractImagesFromTag( std::string filename );
+ /*! \brief delete temporary images
+ */
+ void deleteTemporaryImages();
+
//! \brief define various modes how images can be obtained
enum ImageMode
{
diff --git a/vdr_player.c b/vdr_player.c
index 45099ff..6b178df 100644
--- a/vdr_player.c
+++ b/vdr_player.c
@@ -274,6 +274,12 @@ mgPCMPlayer::~mgPCMPlayer ()
Detach ();
delete m_playlist;
delete m_ringbuffer;
+
+ if( m_img_provider )
+ {
+ delete m_img_provider;
+ m_img_provider = NULL;
+ }
}
void
@@ -363,6 +369,7 @@ mgPCMPlayer::NewImagePlaylist( const char *directory )
if( m_img_provider )
{
delete m_img_provider;
+ m_img_provider = NULL;
}
m_img_provider = mgImageProvider::Create( directory );
m_hasimages = true; // assume we have some images here!
@@ -468,6 +475,7 @@ mgPCMPlayer::Action (void)
if( m_img_provider && the_setup.BackgrMode == 1 )
{
m_hasimages = m_img_provider->updateItem( m_current );
+ cout << "Image provider returns " << m_hasimages << endl;
m_lastshow = -1; // never showed a picture during this song replay
}
@@ -683,10 +691,6 @@ mgPCMPlayer::Action (void)
case msStop:
{
m_playing = false;
- if( m_img_provider )
- {
- delete m_img_provider;
- }
if (m_decoder)
{ // who deletes decoder?