#include <stdio.h>
#include <stdlib.h>
#include <egb.h>
#include <snd.h>
#include <xld.h>
#include <mvs.h>
#include "graphic.h"

#define  IMAGESIZE    2

extern	char	work[];

void	PLAY_movie(char *mvefile)
{
    int             sw, x, y;
    MvsDMovie      *dmovie;
    MvsMovieInfo    movieinf;
    MvsTrackInfo   *trackinf;
    MvsDIndication  dindication;
    MvsDMovieSt     status;
    int             tracknum;
    int             ret;
    BLOCK          *save;
    unsigned char  paletteattr[256];

    /******************/
    /*  再生初期処理  */
    /******************/
    ret = MVS_InitDecompMovie( &dmovie, mvefile, malloc, free, work, 0 );
    if( ret != MVSNORMAL ) { kakunin( "ERR:Init(%d)\n", ret ); return; }

    /**************************/
    /*  イメージ表示関数登録  */
    /**************************/
    ret = MVS_SetFunc( dmovie, 0, EGB_putBlock );
    if( ret != MVSNORMAL ) { kakunin( "ERR:SetBlock(%d)\n", ret ); goto END; }

    /**********************/
    /*  矩形描画関数登録  */
    /**********************/
    ret = MVS_SetFunc( dmovie, 1, EGB_rectangle );
    if( ret != MVSNORMAL ) { kakunin( "ERR:SetRect(%d)\n", ret ); goto END; }

    /**********************/
    /*  ファイル情報取得  */
    /**********************/
    ret = MVS_GetMovieFileInfo( dmovie, &movieinf );
    if( ret != MVSNORMAL ) { kakunin( "ERR:MovieInf(%d)\n", ret ); goto END; }
    tracknum = movieinf.imageNum + movieinf.sndNum;

    /**************************/
    /*  トラック情報領域取得  */
    /**************************/
    trackinf = (MvsTrackInfo *)malloc( tracknum*sizeof(MvsTrackInfo) );
    if( trackinf == NULL ) { kakunin( "ERR:malloc(%d)\n", ret ); goto END; }

    /**********************/
    /*  トラック情報取得  */
    /**********************/
    ret = MVS_GetMovieTrackInfo( dmovie, trackinf );
    if( ret != MVSNORMAL ) { kakunin( "TrackInf(%d)\n", ret ); goto END1; }

    /****************************************/
    /*  再生状態指示情報設定  −　再生開始  */
    /****************************************/
    memset((char *)(&(dindication)), 0, sizeof(dindication));
    dindication.movieTrackID = trackinf[ 0 ].trackID;
    if( movieinf.sndNum )
    {
        dindication.soundTrackID = trackinf[ movieinf.imageNum ].trackID;
        dindication.sndControl   = MVSSNDSTART;
        dindication.volume       = 127;
        dindication.sndChannel   = 71;
    }
    else
    {
        dindication.soundTrackID = 0;
    }

    dindication.startFrame   = 1;
    dindication.numFrame     = 1;
    dindication.direction    = MVSFORWARD;
    dindication.speed        = MVSSPEED100;
    dindication.speedMode    = MVSCONTROL;
    dindication.winPositionX = (trackinf[ 0 ].winMaxX < 320 ? 
				((320 - trackinf[ 0 ].winMaxX) / 2) : 0);
    dindication.winPositionY = (trackinf[ 0 ].winMaxY < 240 ?
				((240 - trackinf[ 0 ].winMaxY) / 2) : 0);
    dindication.winSizeX     = trackinf[ 0 ].winMaxX;
    dindication.winSizeY     = trackinf[ 0 ].winMaxY;
    dindication.winPage      = 0;
    dindication.color        = 0x7FFF;
    dindication.winBitEdit   = MVSIMAGEORIGINAL;
    dindication.numberOfColor = trackinf[ 0 ].numberOfColor;
    dindication.mveAddress    = NULL;
    ret = MVS_SetDecompMovieInd( dmovie, &dindication );
    if( MVSNORMAL != ret ) { kakunin( "ERR:Ind1(%d)\n", ret ); goto END1; }

    MOS_disp(OFF);
    save = DSP_push_vram(0, 0, 639, 479);

    EGB_displayPage( work, 0, 0);

    if ( trackinf[ 0 ].numberOfColor == 8 ) {
        EGB_resolution( work, 0, 12 );
        EGB_displayStart( work, 2, 2, 2 );
        EGB_displayStart( work, 3, 640, 480 );
	EGB_writePage( work, 0 );
	memset( paletteattr, (MVSPALUSEABLE | MVSPALCHANGEABLE), 256 );
	ret = MVS_SetDisplayPalette( dmovie, paletteattr, NULL );
	if( ret != MVSNORMAL ) { goto END3; }
    } else {
	EGB_resolution( work, 0, 10 );
        EGB_resolution( work, 1, 10 );
	EGB_writePage( work, 0 );
 	EGB_displayStart( work, 2, IMAGESIZE, IMAGESIZE );
	EGB_displayStart( work, 3, 320, 240 );
    }

    EGB_writePage( work, 0 );
    EGB_clearScreen( work );
    EGB_displayPage(work, 0, 1);

    SND_pcm_mode_set( 1 );
    SND_pan_set( 71, 64 );

    /**************/
    /*  再生開始  */
    /**************/
    ret = MVS_DecompMovieFile( dmovie, &status );
    if( ret != MVSNORMAL ) { goto END3; }

    /****************************************/
    /*  再生状態指示情報設定  −　再生継続  */
    /****************************************/
    dindication.startFrame = MVSNEXTFRAME;
    dindication.sndControl = MVSSNDCONTINUE;
    ret = MVS_SetDecompMovieInd( dmovie, &dindication );
    if( MVSNORMAL != ret ) { goto END2; }

    /****************/
    /*  再生ループ  */
    /****************/
    do {
        ret = MVS_DecompMovieFile( dmovie, &status );
        if( ret != MVSNORMAL )
	    break;
	MOS_rdpos(&sw, &x, &y);
	if ( sw != 0 )
	    break;
    } while ( status.status != MVSEOM );

END2:
    /****************************************/
    /*  再生状態指示情報設定  −　再生停止  */
    /****************************************/
    dindication.movieTrackID = 0;
    dindication.soundTrackID = 0;
    dindication.sndControl   = MVSSNDSTOP;
    ret = MVS_SetDecompMovieInd( dmovie, &dindication );

    /**************/
    /*  再生停止  */
    /**************/
    ret = MVS_DecompMovieFile( dmovie, &status );

END3:
    EGB_displayPage(work, 0, 0);
    EGB_resolution(work, 0, 3);
    EGB_resolution(work, 1, 3);
    EGB_writePage(work, 1);
    DSP_palette();
    EGB_clearScreen(work);
    EGB_writePage(work, 0);
    DSP_palette();
    EGB_clearScreen(work);
    DSP_pop_vram(save);
    EGB_displayPage(work, 0, 3);
    MOS_disp(ON);

    FILE_redisp();

    if( ret != MVSNORMAL )
	kakunin("ERR: MVS error");

END1:
    /**************************/
    /*  トラック情報領域解放  */
    /**************************/
    free( trackinf );

END:
    /******************/
    /*  再生終了処理  */
    /******************/
    ret = MVS_EndDecompMovie( dmovie );
    if( ret != MVSNORMAL )
	kakunin( "ERR:End(%d)\n", ret );
}
