summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Brachold <vdr07@deltab.de>2006-01-14 11:09:41 +0000
committerAndreas Brachold <vdr07@deltab.de>2006-01-14 11:09:41 +0000
commit09842bddc7ce23b92648b95004407679be99cb03 (patch)
tree2d66d078d2d1bf2cc9b96e1154c08be36c0bea8d
parent928853f57f548b9a301811cf374b9a4889b68f17 (diff)
downloadvdr-plugin-image-09842bddc7ce23b92648b95004407679be99cb03.tar.gz
vdr-plugin-image-09842bddc7ce23b92648b95004407679be99cb03.tar.bz2
now inital rotation depends founded exif data
-rw-r--r--HISTORY3
-rw-r--r--README2
-rw-r--r--README.DE2
-rw-r--r--TODO1
-rw-r--r--control-image.c53
-rw-r--r--data-image.c14
-rw-r--r--data-image.h8
-rw-r--r--exif.c92
-rw-r--r--exif.h19
9 files changed, 163 insertions, 31 deletions
diff --git a/HISTORY b/HISTORY
index da30f01..cf18c2b 100644
--- a/HISTORY
+++ b/HISTORY
@@ -1,6 +1,9 @@
VDR Plugin 'image' Revision History
-----------------------------------
+2006-01-14
+- now inital rotation depends founded exif data
+
2006-01-13
- revert changes from 2005-12-17, throw is failed with other plugins thats use ffmpeg
diff --git a/README b/README
index 66a3bb3..99d1866 100644
--- a/README
+++ b/README
@@ -22,7 +22,7 @@ Required:
- plugin depends follow packages
+ ffmpeg (tested with ffmpeg-0.4.8/ffmpeg-0.4.9pre1/ffmpeg-cvs)
http://ffmpeg.sourceforge.net
- + libexif
+ + libexif-0.6.13 (see below for build without this)
http://libexif.sourceforge.net/
+ for running your will need also package netpbm
http://netpbm.sourceforge.net/
diff --git a/README.DE b/README.DE
index 7c87f4b..8a72561 100644
--- a/README.DE
+++ b/README.DE
@@ -22,7 +22,7 @@ Benötigt:
- das Plugin ist abhängig vom folgenden Paketen
+ ffmpeg (getestet mit ffmpeg-0.4.8/ffmpeg-0.4.9pre1/ffmpeg-cvs)
http://ffmpeg.sourceforge.net
- + libexif
+ + libexif-0.6.13 (siehe unten, für Kompilieren ohne diese)
http://libexif.sourceforge.net/
+ zur Ausführung wird auch das Paket netpbm benötigt
http://netpbm.sourceforge.net/
diff --git a/TODO b/TODO
index 5e8b5ef..772eeb3 100644
--- a/TODO
+++ b/TODO
@@ -1,7 +1,6 @@
TODO
Proper Scale on 16:9
-Exif automated rotation
Change BLUE/EXIT > Stop to BLUE > Stop / EXIT > reshow Browser
reload Image after commands execution, if image changed
diff --git a/control-image.c b/control-image.c
index fc149ea..aa11b4d 100644
--- a/control-image.c
+++ b/control-image.c
@@ -77,7 +77,7 @@ cImageControl::cImageControl(cSlideShow * pNewSlideShow)
m_ePlayMode = ePlayModeNormal;
m_bSlideShowActiv = ImageSetup.m_bSlideShow;
m_bSlideShowBefore = false;
-
+
// Support for Zoom
m_nZoomFactor = 0;
m_nRealImageWidth = 0;
@@ -90,35 +90,15 @@ cImageControl::cImageControl(cSlideShow * pNewSlideShow)
*/
cImageControl::~cImageControl()
{
- if(m_pCmdMenu) {
- delete m_pCmdMenu;
- m_pCmdMenu = NULL;
- }
-
-#ifdef HAVE_LIBEXIF
- if(m_pExifMenu) {
- delete m_pExifMenu;
- m_pExifMenu = NULL;
- }
-#endif
-
// Notity cleanup all cStatusMonitor
cStatus::MsgReplaying(this, "image", NULL, false);
- // Hide OSD
- HideOSD();
- if(m_pDisplayReplay) {
- delete m_pDisplayReplay;
- m_pDisplayReplay = NULL;
- }
+ // Free OSD Data
+ Hide();
// Stop Playback
Stop();
if(player)
delete player;
player = NULL;
-
- if(m_szLastShowStatusMsg)
- free(m_szLastShowStatusMsg);
- m_szLastShowStatusMsg = 0;
}
void cImageControl::Show(void)
@@ -128,7 +108,6 @@ void cImageControl::Show(void)
void cImageControl::Hide(void)
{
- m_eOSDStatusVisable = eDisplayNothing;
HideOSD();
if(m_szLastShowStatusMsg)
@@ -709,9 +688,33 @@ void cImageControl::OriginalImage(bool bCached)
{
m_nZoomFactor = 0;
m_nRotation = 2;
+#ifdef HAVE_LIBEXIF
+ cImage* pImage = theSlideShow.GetImage();
+ if(pImage)
+ {
+ int nRot = pImage->DefaultRotate();
+ switch(nRot)
+ {
+ default:
+ case 0:
+ m_nRotation = 2;
+ break;
+ case 90:
+ m_nRotation = 1;
+ break;
+ case 180:
+ m_nRotation = 0;
+ break;
+ case 270:
+ m_nRotation = 3;
+ break;
+ }
+ //fprintf(stderr,"imageplugin: Use '%s' : Rotated %d(%d)\n", pImage->Name(), nRot, m_nRotation);
+ }
+#endif
m_ePlayMode = ePlayModeNormal;
if(!CheckAccess()
- || !player->Convert(bCached?"":szRotation[m_nRotation]))
+ || !player->Convert((bCached && m_nRotation == 2)?"":szRotation[m_nRotation]))
{
OSD_ErrorNumMsg(errno,tr("Operation failed"));
}
diff --git a/data-image.c b/data-image.c
index 0e8c778..137e264 100644
--- a/data-image.c
+++ b/data-image.c
@@ -29,6 +29,10 @@
#include "data.h"
#include "setup-image.h"
+#ifdef HAVE_LIBEXIF
+#include "exif.h"
+#endif
+
cFileSources ImageSources;
// --- cImage -------------------------------------------------------------
@@ -40,9 +44,17 @@ cImage::cImage(const char *szName, cFileSource * pSource)
, m_szFileNameIndex(NULL)
, m_szFileNameZoom(NULL)
{
- if(szName)
+ if(szName) {
m_szFileName = m_pSource->BuildName(szName);
+#ifdef HAVE_LIBEXIF
+ ImageMirror mirror = NONE;
+ GetRotationFromExifData (m_szFileName, m_nDefaultRotate, mirror);
+ if(mirror != NONE)
+ isyslog("imageplugin: automated rotation from exif data with mirroring (%d) is'nt supported, found at file '%s' \n", mirror, m_szFileName);
+#endif
+ }
m_pSource->Block();
+
}
cImage::~cImage()
diff --git a/data-image.h b/data-image.h
index b21ba4b..474b344 100644
--- a/data-image.h
+++ b/data-image.h
@@ -23,7 +23,6 @@
#define ___DATA_IMAGE_H
#include "data.h"
-
#include <vdr/tools.h>
// ----------------------------------------------------------------
@@ -43,7 +42,9 @@ class cImage
char *m_szFileNamePNM;
char *m_szFileNameIndex;
char *m_szFileNameZoom;
-
+#ifdef HAVE_LIBEXIF
+ int m_nDefaultRotate;
+#endif
protected:
void Unlink(const char *szName);
void Clear(void);
@@ -60,6 +61,9 @@ public:
const char *NamePNM();
const char *NameIndex();
+#ifdef HAVE_LIBEXIF
+ int DefaultRotate() const { return m_nDefaultRotate; }
+#endif
};
// ----------------------------------------------------------------
diff --git a/exif.c b/exif.c
index 7b913c7..1149e68 100644
--- a/exif.c
+++ b/exif.c
@@ -181,3 +181,95 @@ eOSState cImageControl::ProcessKeyExif(eKeys nKey)
return osContinue;
}
}
+
+//////////////////////////////////////////////////////////////////////////////
+/** get value from exif tag
+@return ExifShort - requestet value or 0 if failed
+@param const char *filename - used file name
+@param ExifTag etag - wanted exif Tag, see exif-tag.h*/
+static ExifShort GetExifTag (const char *filename, ExifTag etag)
+{
+ ExifData *edata;
+ unsigned int i, j;
+
+ edata = exif_data_new_from_file (filename);
+
+ if (edata == NULL)
+ return 0;
+
+ for (i = 0; i < EXIF_IFD_COUNT; i++) {
+ ExifContent *content = edata->ifd[i];
+
+ if (! edata->ifd[i] || ! edata->ifd[i]->count)
+ continue;
+
+ for (j = 0; j < content->count; j++) {
+ ExifEntry *e = content->entries[j];
+
+ if (! content->entries[j])
+ continue;
+
+ if (e->tag == etag) {
+ ExifByteOrder o = exif_data_get_byte_order (e->parent->parent);
+ ExifShort retval = exif_get_short (e->data, o);
+ exif_data_unref (edata);
+ return retval;
+ }
+ }
+ }
+
+ exif_data_unref (edata);
+
+ return 0;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+/** get rotation from exif data
+@return ImageExifOrientation - requestet value or 0 if failed
+@param int& rotate - reference for rotation
+@param ImageMirror& mirror - reference for mirroring image */
+ImageExifOrientation GetRotationFromExifData (const char *filename, int& rotate, ImageMirror& mirror)
+{
+ ImageExifOrientation ieo = (ImageExifOrientation)GetExifTag (filename, EXIF_TAG_ORIENTATION);
+
+ switch (ieo) {
+ case IMAGE_EXIF_ORIENTATION_TOP_RIGHT:
+ rotate = 0;
+ mirror = MIRROR;
+ break;
+ case IMAGE_EXIF_ORIENTATION_BOTTOM_LEFT:
+ rotate = 180;
+ mirror = MIRROR;
+ break;
+ case IMAGE_EXIF_ORIENTATION_LEFT_TOP:
+ rotate = 90;
+ mirror = MIRROR;
+ break;
+ case IMAGE_EXIF_ORIENTATION_RIGHT_BOTTOM:
+ rotate = 90;
+ mirror = FLIP;
+ break;
+ case IMAGE_EXIF_ORIENTATION_TOP_LEFT:
+ rotate = 0;
+ mirror = NONE;
+ break;
+ case IMAGE_EXIF_ORIENTATION_RIGHT_TOP:
+ rotate = 90;
+ mirror = NONE;
+ break;
+ case IMAGE_EXIF_ORIENTATION_BOTTOM_RIGHT:
+ rotate = 180;
+ mirror = NONE;
+ break;
+ case IMAGE_EXIF_ORIENTATION_LEFT_BOTTOM:
+ rotate = 270;
+ mirror = NONE;
+ break;
+ default:
+ rotate = 0;
+ mirror = NONE;
+ break;
+ }
+ return ieo;
+}
+
diff --git a/exif.h b/exif.h
index 55ccdb6..868a320 100644
--- a/exif.h
+++ b/exif.h
@@ -38,5 +38,24 @@ public:
virtual eOSState ProcessKey(eKeys Key);
};
+enum ImageExifOrientation {
+ IMAGE_EXIF_ORIENTATION_NONE = 0,
+ IMAGE_EXIF_ORIENTATION_TOP_LEFT,
+ IMAGE_EXIF_ORIENTATION_TOP_RIGHT,
+ IMAGE_EXIF_ORIENTATION_BOTTOM_RIGHT,
+ IMAGE_EXIF_ORIENTATION_BOTTOM_LEFT,
+ IMAGE_EXIF_ORIENTATION_LEFT_TOP,
+ IMAGE_EXIF_ORIENTATION_RIGHT_TOP,
+ IMAGE_EXIF_ORIENTATION_RIGHT_BOTTOM,
+ IMAGE_EXIF_ORIENTATION_LEFT_BOTTOM
+};
+
+enum ImageMirror {
+ NONE = 0,
+ MIRROR,
+ FLIP
+};
+
+ImageExifOrientation GetRotationFromExifData (const char *filename, int& rotate, ImageMirror& mirror);
#endif //__MENU_EXIF_H