Mercurial > mm7
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)