changeset 2359:5b9fb75b6f54

alSourceStop(mSourceID);
author Ritor1
date Sat, 12 Apr 2014 02:29:26 +0600
parents 23192f5b41d4
children 63ad4e3606f4 eb136041adf1
files MMT.cpp MediaPlayer.cpp MediaPlayer.h VideoPlayer.cpp
diffstat 4 files changed, 64 insertions(+), 56 deletions(-) [+]
line wrap: on
line diff
--- a/MMT.cpp	Thu Apr 10 17:35:26 2014 +0600
+++ b/MMT.cpp	Sat Apr 12 02:29:26 2014 +0600
@@ -313,6 +313,7 @@
       {
         case UIMSG_MMT_MainMenu_MM7: //кнопка игры ММ7
           //GUIWindow::Create(495, 172, 0, 0, WINDOW_PressedButton2, (int)pMainMenu_BtnNew, 0);
+          alSourceStop(mSourceID);
           ShowMM7IntroVideo_and_LoadingScreen();
           SetCurrentMenuID(MENU_MAIN);
           break;
--- a/MediaPlayer.cpp	Thu Apr 10 17:35:26 2014 +0600
+++ b/MediaPlayer.cpp	Sat Apr 12 02:29:26 2014 +0600
@@ -27,6 +27,8 @@
 Media::IMovie *pMovie;
 Media::ITrack *pTrack;
 
+int mSourceID;
+
 void PlayMovie(const wchar_t * pFilename);
 void PlayAudio(const wchar_t * pFilename);
 void LoadMovie(const char *);
@@ -737,6 +739,7 @@
     virtual void Play(bool loop)
     {
       provider->PlayTrack16(device_buffer, loop);
+      mSourceID = device_buffer->source_id;
     }
   
   protected:
@@ -905,75 +908,77 @@
       }
 
       volatile int frameFinished = false;
-      //чтение пакетов
-      // keep reading packets until we hit the end or find a video packet
-      while (av_read_frame(format_ctx, avpacket) >= 0)
+      do
       {
-        // Is this a packet from the video stream?
-        // audio packet - queue into playing
-        //Принадлежит ли пакет к аудиопотоку
+        if (av_read_frame(format_ctx, avpacket) < 0) //воспроизведение завершено
+        {
+          if (loop_current_file)
+          {
+            if (av_seek_frame(format_ctx, video.stream_idx, format_ctx->start_time, AVSEEK_FLAG_BACKWARD) < 0);
+              fprintf(stderr, "%s: error while seeking\n", format_ctx->filename);
+            while (avpacket->stream_index!=video.stream_idx)
+            {    
+              av_free_packet(avpacket);
+              if (av_read_frame(format_ctx, avpacket)<0)
+                av_seek_frame(format_ctx, -1, format_ctx->start_time, AVSEEK_FLAG_BACKWARD);
+            }
+          }
+          else
+		  {
+            end_current_file = true;
+		   return;
+		  }
+          // probably movie is finished
+          //__debugbreak();
+        }
         if (avpacket->stream_index == audio.stream_idx)
         {
           MemoryStream audio_data;
-		  //Декодирование аудио фрейма
           if (DecodeAudioFrame(audio.dec_ctx, avpacket, avframe, &audio_data, &num_audio_samples))
-            provider->Stream16(audio_data_in_device, num_audio_samples, audio_data.Ptr()); //отправляем на воспроизведение
-		  continue;
+            provider->Stream16(audio_data_in_device, num_audio_samples, audio_data.Ptr());
+          //continue;
         }
-        // Decode video frame
-        //пакет к видеопотоку
+        // video packet - decode & maybe show
         else if (avpacket->stream_index == video.stream_idx)
         {
-          //Функция avcodec_decode_video2 осуществляет декодирование пакета в фрейм с использованием кодека,
-          //который мы получили раньше (codec_context). Функция устанавливает положительное значение frame_finished в случае
-          //если фрейм декодирован целиком (то есть один фрейм может занимать несколько пакетов и frame_finished будет 
-          //установлен только при декодировании последнего пакета).
-          avcodec_decode_video2(video.dec_ctx, avframe, (int *)&frameFinished, avpacket);
-          if (frameFinished)
+          do
           {
-            if (last_resampled_frame_data[0])
-              av_freep(&last_resampled_frame_data[0]);
+            if (avcodec_decode_video2(video.dec_ctx, avframe, (int *)&frameFinished, avpacket) < 0)
+              __debugbreak();
+          } while (!frameFinished);
+        }
+      }
+      while (avpacket->stream_index != video.stream_idx ||
+               avpacket->pts != desired_frame_number);
+
+      if (frameFinished)
+      {
+        if (last_resampled_frame_data[0])
+          av_freep(&last_resampled_frame_data[0]);
 
-            AVPixelFormat  rescaled_format = AV_PIX_FMT_RGB32;
-            uint8_t       *rescaled_data[4] = {nullptr, nullptr, nullptr, nullptr};
-            int            rescaled_linesize[4] = {0, 0, 0, 0};
-            if (av_image_alloc(rescaled_data, rescaled_linesize, current_movie_width, current_movie_height, rescaled_format, 1) >= 0)
-            {
-              // создание контекста для преобразования
-              SwsContext *converter = sws_getContext(avframe->width, avframe->height, (AVPixelFormat)avframe->format,
-                                                 current_movie_width, current_movie_height, rescaled_format,
-                                                 SWS_BICUBIC, nullptr, nullptr, nullptr);
-              // преобразование кадра(масштабирование)
-              sws_scale(converter, avframe->data, avframe->linesize, 0, avframe->height, rescaled_data, rescaled_linesize);
-              sws_freeContext(converter);
-
-			  //копирование в возвращаемую переменную
-              memcpy(dst_surface, rescaled_data[0], current_movie_height * rescaled_linesize[0]);
+        AVPixelFormat  rescaled_format = AV_PIX_FMT_RGB32;
+        uint8_t       *rescaled_data[4] = {nullptr, nullptr, nullptr, nullptr};
+        int            rescaled_linesize[4] = {0, 0, 0, 0};
+        if (av_image_alloc(rescaled_data, rescaled_linesize, current_movie_width, current_movie_height, rescaled_format, 1) >= 0)
+        {
+          // создание контекста для преобразования
+          SwsContext *converter = sws_getContext(avframe->width, avframe->height, (AVPixelFormat)avframe->format,
+                                               current_movie_width, current_movie_height, rescaled_format,
+                                               SWS_BICUBIC, nullptr, nullptr, nullptr);
+          // преобразование кадра(масштабирование)
+          sws_scale(converter, avframe->data, avframe->linesize, 0, avframe->height, rescaled_data, rescaled_linesize);
+          sws_freeContext(converter);
 
-              last_resampled_frame_num = desired_frame_number;
-              memcpy(last_resampled_frame_data, rescaled_data, sizeof(rescaled_data));
-              memcpy(last_resampled_frame_linesize, rescaled_linesize, sizeof(rescaled_linesize));
-            }
-          }
-          else
-            memset(dst_surface, 0, current_movie_width * current_movie_height * 4);	 //записать 0 в выходную переменную
+          //копирование в возвращаемую переменную
+          memcpy(dst_surface, rescaled_data[0], current_movie_height * rescaled_linesize[0]);
+
+          last_resampled_frame_num = desired_frame_number;
+          memcpy(last_resampled_frame_data, rescaled_data, sizeof(rescaled_data));
+          memcpy(last_resampled_frame_linesize, rescaled_linesize, sizeof(rescaled_linesize));
         }
-        return;
-      }// while (avpacket->stream_index != video.stream_idx ||
-         //      avpacket->pts != desired_frame_number);
-	  //завершение пакетов
-      if (loop_current_file) //зациклен ли файл
-      {
-        av_seek_frame(format_ctx, video.stream_idx, 0, AVSEEK_FLAG_ANY);
       }
       else
-      {
-        // probably movie is finished
-        //__debugbreak();
-        end_of_file = true;
-        end_current_file = true;
-        return;// nullptr;
-      }
+        memset(dst_surface, 0, width * current_movie_height * 4);
     }
 
     virtual void Play()
--- a/MediaPlayer.h	Thu Apr 10 17:35:26 2014 +0600
+++ b/MediaPlayer.h	Sat Apr 12 02:29:26 2014 +0600
@@ -35,6 +35,8 @@
 extern int current_movie_width;
 extern int current_movie_height;
 
+extern int mSourceID;
+
 int64_t seekFunction(void* opaque, int64_t offset, int whence);
 extern void PlayMovie(const wchar_t * pFilename);
 extern void PlayAudio(const wchar_t * pFilename);
--- a/VideoPlayer.cpp	Thu Apr 10 17:35:26 2014 +0600
+++ b/VideoPlayer.cpp	Sat Apr 12 02:29:26 2014 +0600
@@ -301,7 +301,7 @@
       auto image = new char[current_movie_width * current_movie_height * 4];
 
       pMovie->GetNextFrame(dt, image);
-      Sleep(70);  //Ritor1:it's my include
+      Sleep(60);  //Ritor1:it's my include
 
     int image_array[460 * 344];//game_viewport_width * game_viewport_height
     if (image)