Difference between revisions of "External MOVIE (Sample)"

From SEGGER Wiki
Jump to: navigation, search
(Created page with "{| class="wikitable" style="float:right; margin-left: 10px; background-color: #f9f9f9;" ! colspan="2" style="font-weight:bold; font-size:17px; font-family:Arial, Helvetica, sa...")
 
 
Line 21: Line 21:
   
 
This sample demonstrates how to display an emWin movie from external memory. It supports both the usage of Windows file system and emFile.
 
This sample demonstrates how to display an emWin movie from external memory. It supports both the usage of Windows file system and emFile.
  +
  +
The sample also works with '''AVI''' files on external memory instead of EMF files. It should be noted though that the codec to be used in the AVI file has to be MJPEG and the AVI file has to contain an index list called idx1 list.
   
 
== Code ==
 
== Code ==

Latest revision as of 15:33, 6 January 2021

GUI_MOVIE_CreateMovieEx.c
GUI MOVIE CreateMovie.gif
File(s) required
  • GUI_MOVIE_CreateMovieEx.c
  • Video.emf
Runs in simulation Yes
Runs on target Yes
Download GUI_MOVIE_CreateMovieEx.zip

This sample demonstrates how to display an emWin movie from external memory. It supports both the usage of Windows file system and emFile.

The sample also works with AVI files on external memory instead of EMF files. It should be noted though that the codec to be used in the AVI file has to be MJPEG and the AVI file has to contain an index list called idx1 list.

Code

/*********************************************************************
*                    SEGGER Microcontroller GmbH                     *
*        Solutions for real time microcontroller applications        *
**********************************************************************
*                                                                    *
*        (c) 1996 - 2020  SEGGER Microcontroller GmbH                *
*                                                                    *
*        Internet: www.segger.com    Support:  support@segger.com    *
*                                                                    *
**********************************************************************

** emWin V6.10 - Graphical user interface for embedded applications **
emWin is protected by international copyright laws.   Knowledge of the
source code may not be used to write a similar product.  This file may
only  be used  in accordance  with  a license  and should  not be  re-
distributed in any way. We appreciate your understanding and fairness.
----------------------------------------------------------------------
File        : GUI_MOVIE_CreateMovieEx.c
Purpose     : Sample that demonstrates how to play an emWin movie
              file from extern memory.
              This sample supports both usage in the Windows
              Simulation as well as usage on a target device using
              emFile.
Requirements: WindowManager - ( )
              MemoryDevices - ( )
              AntiAliasing  - ( )
              VNC-Server    - ( )
              PNG-Library   - ( )
              TrueTypeFonts - ( )
---------------------------END-OF-HEADER------------------------------
*/

#include "DIALOG.h"
#include <stdio.h>
#ifdef WIN32
  #include <windows.h>
#else
  #include "FS.h"
#endif

/*********************************************************************
*
*       Defines
*
**********************************************************************
*/
#ifdef WIN32
  #define FILE_PATH "C:\\Work\\emWin\\Intern\\TutorialV6\\Movies\\Video.emf"
#else
  #define FILE_PATH "Video.emf"
#endif

/*********************************************************************
*
*       Static data
*
**********************************************************************
*/
static int _TimeStart;
static int _TimeEnd;

/*********************************************************************
*
*       Static code
*
**********************************************************************
*/
/*********************************************************************
*
*       _GetData
*
* Function description
*   Reading data directly from file system
*/
int _GetData(void * p, const U8 ** ppData, unsigned NumBytes, U32 Off) {
  U32 NumBytesRead;
#ifdef WIN32
  HANDLE hFile;

  hFile = *(HANDLE *)p;
  SetFilePointer(hFile, Off, 0, FILE_BEGIN);
  ReadFile(hFile, (U8 *)*ppData, NumBytes, &NumBytesRead, NULL);
#else
  FS_FILE * pFile;

  pFile = (FS_FILE *)p;
  FS_SetFilePos(pFile, Off, FS_FILE_BEGIN);
  NumBytesRead = FS_Read(pFile, (U8 *)*ppData, NumBytes);
#endif
  return NumBytesRead;
}

/*********************************************************************
*
*       _cbNotify
*
* Function description
*   Uses multiple buffering (if available) to avoid tearing effects.
*/
static void _cbNotify(GUI_HMEM hMovie, int Notification, U32 CurrentFrame) {
  char acBuffer[32];
  int  TimeD;
  int  Fps;
  
  GUI_USE_PARA(hMovie);
  GUI_USE_PARA(CurrentFrame);
  switch (Notification) {
  case GUI_MOVIE_NOTIFICATION_PREDRAW:
    //
    // Begin multi-buffering if available.
    //
    GUI_MULTIBUF_Begin();
    //
    // Cache is used instead if there is no multi-buffering.
    //
    LCD_ControlCache(LCD_CC_LOCK);
    _TimeStart = GUI_GetTime();
    break;
  case GUI_MOVIE_NOTIFICATION_POSTDRAW:
    //
    // Calculate and show FPS.
    //
    _TimeEnd = GUI_GetTime();
    TimeD = (_TimeEnd - _TimeStart) ? _TimeEnd - _TimeStart : 1;
    Fps = (1000 / TimeD);
    if (Fps > 30) {
      sprintf(acBuffer, "FPS: max.");
    } else {
      sprintf(acBuffer, "FPS: %d", Fps);
    }
    GUI_DispStringAt(acBuffer, 0, 0);
    //
    // End multi-buffering / cache.
    //
    LCD_ControlCache(LCD_CC_UNLOCK);
    GUI_MULTIBUF_End();
    break;
  case GUI_MOVIE_NOTIFICATION_START:
    break;
  case GUI_MOVIE_NOTIFICATION_STOP:
    break;
  }
}

/*********************************************************************
*
*       Public code
*
**********************************************************************
*/
/*********************************************************************
*
*       MainTask
*/
void MainTask(void) {
  GUI_MOVIE_HANDLE hMovie;
  GUI_MOVIE_INFO   Info;
#ifdef WIN32
  HANDLE           hFile;
  #define PARAM    &hFile
#else
  FS_FILE        * pFile;
  const char       acVolumeName[64];
  #define PARAM    pFile
#endif

  //
  // Init emWin.
  //
  GUI_Init();
#ifdef WIN32
  hFile = CreateFile(FILE_PATH, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
#else
  //
  // Start emFile.
  //
  FS_Init();
  //
  // Enable long file name support.
  //
  FS_FAT_SupportLFN();
  //
  // Mount volume.
  //
  FS_GetVolumeName(0, acVolumeName, sizeof(acVolumeName));
  if (FS_Mount(acVolumeName) > 0) {
    //
    // Open file.
    //
    pFile = FS_FOpen(FILE_PATH, "r");
  }
#endif
  //
  // Get info about movie.
  //
  if(GUI_MOVIE_GetInfoEx(_GetData, PARAM, &Info) == 0) {
    //
    // Create movie handle and show it in an endless loop.
    //
    hMovie = GUI_MOVIE_CreateEx(_GetData, PARAM, _cbNotify);
    if (hMovie) {
      GUI_MOVIE_Show(hMovie, 0, 0, 1);
    }
  }

  while (1) {
    GUI_Delay(100);
  }
}

/*************************** End of file ****************************/