diff options
author | Andreas Brachold <vdr07@deltab.de> | 2006-01-14 11:09:41 +0000 |
---|---|---|
committer | Andreas Brachold <vdr07@deltab.de> | 2006-01-14 11:09:41 +0000 |
commit | 09842bddc7ce23b92648b95004407679be99cb03 (patch) | |
tree | 2d66d078d2d1bf2cc9b96e1154c08be36c0bea8d | |
parent | 928853f57f548b9a301811cf374b9a4889b68f17 (diff) | |
download | vdr-plugin-image-09842bddc7ce23b92648b95004407679be99cb03.tar.gz vdr-plugin-image-09842bddc7ce23b92648b95004407679be99cb03.tar.bz2 |
now inital rotation depends founded exif data
-rw-r--r-- | HISTORY | 3 | ||||
-rw-r--r-- | README | 2 | ||||
-rw-r--r-- | README.DE | 2 | ||||
-rw-r--r-- | TODO | 1 | ||||
-rw-r--r-- | control-image.c | 53 | ||||
-rw-r--r-- | data-image.c | 14 | ||||
-rw-r--r-- | data-image.h | 8 | ||||
-rw-r--r-- | exif.c | 92 | ||||
-rw-r--r-- | exif.h | 19 |
9 files changed, 163 insertions, 31 deletions
@@ -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 @@ -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/ @@ -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/ @@ -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 }; // ---------------------------------------------------------------- @@ -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; +} + @@ -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 |