From e7ec7ec68a01c6cf7d0e1986431a6f4da5ff73e9 Mon Sep 17 00:00:00 2001 From: Rodrigo Braz Monteiro Date: Wed, 1 Mar 2006 03:17:31 +0000 Subject: [PATCH] Some highly failed attempt to fix mkv support with lavc, and updated manual to include information on how to use FexTracker Originally committed to SVN as r189. --- core/mkv_wrap.cpp | 6 ++- core/mkv_wrap.h | 8 +++- core/subs_grid.cpp | 12 ++++-- core/subtitle_format_srt.cpp | 1 + core/video_provider.h | 7 ++++ core/video_provider_lavc.cpp | 71 +++++++++++++++++++++++------------ core/video_provider_lavc.h | 5 ++- docs/help.hm3 | Bin 400384 -> 402944 bytes 8 files changed, 79 insertions(+), 31 deletions(-) diff --git a/core/mkv_wrap.cpp b/core/mkv_wrap.cpp index 50b138248..8a0265f81 100644 --- a/core/mkv_wrap.cpp +++ b/core/mkv_wrap.cpp @@ -128,7 +128,6 @@ void MatroskaWrapper::Parse() { keyFrames.Clear(); bytePos.Clear(); timecodes.clear(); - std::list frames; // Get info int tracks = mkv_GetNumTracks(file); @@ -184,6 +183,11 @@ void MatroskaWrapper::Parse() { } } + // Copy raw + for (std::list::iterator cur=frames.begin();cur!=frames.end();cur++) { + rawFrames.push_back(*cur); + } + // Process timecodes and keyframes frames.sort(); MkvFrame curFrame(false,0,0); diff --git a/core/mkv_wrap.h b/core/mkv_wrap.h index f2350058a..686145336 100644 --- a/core/mkv_wrap.h +++ b/core/mkv_wrap.h @@ -42,6 +42,7 @@ #include #include #include +#include #include "MatroskaParser.h" #include "vfr.h" @@ -78,8 +79,6 @@ bool operator < (MkvFrame &t1, MkvFrame &t2); // Matroska wrapper class class MatroskaWrapper { private: - MatroskaFile *file; - MkvStdIO *input; wxArrayInt keyFrames; std::vector timecodes; wxArrayInt bytePos; @@ -87,6 +86,11 @@ private: void Parse(); public: + MkvStdIO *input; + MatroskaFile *file; + std::list frames; + std::vector rawFrames; + MatroskaWrapper(); ~MatroskaWrapper(); diff --git a/core/subs_grid.cpp b/core/subs_grid.cpp index c41998287..e86ad9de3 100644 --- a/core/subs_grid.cpp +++ b/core/subs_grid.cpp @@ -36,6 +36,10 @@ //////////// // Includes +#include +#include +#include +#include #include "subs_grid.h" #include "ass_file.h" #include "ass_dialogue.h" @@ -46,10 +50,7 @@ #include "options.h" #include "frame_main.h" #include "hotkeys.h" -#include -#include -#include -#include +#include "utils.h" /////////////// @@ -812,6 +813,9 @@ void SubtitlesGrid::DeleteLines(wxArrayInt target) { AdjustScrollbar(); ass->FlagAsModified(); CommitChanges(); + + // Update editbox + editBox->SetToLine(MID(0,editBox->linen,GetRows()-1)); } diff --git a/core/subtitle_format_srt.cpp b/core/subtitle_format_srt.cpp index 04aa5a26b..75a6c2bc2 100644 --- a/core/subtitle_format_srt.cpp +++ b/core/subtitle_format_srt.cpp @@ -162,6 +162,7 @@ void SRTSubtitleFormat::WriteFile(wxString _filename,wxString encoding) { } else throw _T("Unexpected line type"); } + ClearCopy(); } diff --git a/core/video_provider.h b/core/video_provider.h index c4cb0a488..3e72637fb 100644 --- a/core/video_provider.h +++ b/core/video_provider.h @@ -37,6 +37,11 @@ #pragma once +////////////// +// Prototypes +class SubtitleRasterizer; + + //////////////////////////// // Video Provider interface class VideoProvider { @@ -61,5 +66,7 @@ public: virtual int GetSourceWidth()=0; // Returns the original source width in pixels virtual int GetSourceHeight()=0; // Returns the original source height in pixels + SubtitleRasterizer *subsRaster; + static VideoProvider *GetProvider(wxString video,wxString subtitles); }; diff --git a/core/video_provider_lavc.cpp b/core/video_provider_lavc.cpp index 2bf374675..b5c38f771 100644 --- a/core/video_provider_lavc.cpp +++ b/core/video_provider_lavc.cpp @@ -38,6 +38,7 @@ // Headers #ifdef USE_LAVC #include +#include #include "video_provider_lavc.h" #include "utils.h" #include "vfr.h" @@ -125,15 +126,15 @@ void LAVCVideoProvider::LoadVideo(wxString filename) { if (result < 0) throw _T("Failed to open video decoder"); // Check length - isVFR = false; + isMkv = false; length = stream->duration; if (length <= 0) { if (strcmp(formatContext->iformat->name,"matroska") == 0) { - throw _T("FFmpeg fails at seeking Matroska. If you have any idea on how to fix it, Aegisub is open source."); - MatroskaWrapper::wrapper.Open(filename); - length = MatroskaWrapper::wrapper.GetFrameCount(); - bytePos = MatroskaWrapper::wrapper.GetBytePositions(); - isVFR = true; + //throw _T("FFmpeg fails at seeking Matroska. If you have any idea on how to fix it, Aegisub is open source."); + mkv.Open(filename); + length = mkv.GetFrameCount(); + bytePos = mkv.GetBytePositions(); + isMkv = true; } if (length <= 0) throw _T("Returned invalid stream length"); } @@ -160,6 +161,9 @@ void LAVCVideoProvider::LoadVideo(wxString filename) { /////////////// // Close video void LAVCVideoProvider::Close() { + // Close mkv + if (isMkv) mkv.Close(); + // Clean buffers if (buffer1) delete buffer1; if (buffer2) delete buffer2; @@ -305,39 +309,60 @@ wxBitmap LAVCVideoProvider::GetFrame(int n) { else { // Prepare seek __int64 seekTo; - int result; + int result = 0; // Get time to seek to - if (isVFR) { + if (isMkv) { //__int64 base = AV_TIME_BASE; //__int64 time = VFR_Output.GetTimeAtFrame(n,true) * base / 1000000; //seekTo = av_rescale(time,stream->time_base.den,AV_TIME_BASE * __int64(stream->time_base.num)); //seekTo = __int64(n) * 1000 * stream->r_frame_rate.den / stream->r_frame_rate.num; - seekTo = bytePos[n]; + //seekTo = bytePos[n]; - result = av_seek_frame(formatContext,vidStream,seekTo,AVSEEK_FLAG_BACKWARD | AVSEEK_FLAG_BYTE); + //result = av_seek_frame(formatContext,vidStream,seekTo,AVSEEK_FLAG_BACKWARD | AVSEEK_FLAG_BYTE); + + // Prepare mkv seek + ulonglong startTime, endTime, filePos; + unsigned int rt, frameSize, frameFlags; + ulonglong targetTime = __int64(VFR_Output.GetTimeAtFrame(n,true,true))*1000000; + //ulonglong targetTime = __int64(n) * 1000 * stream->r_frame_rate.den / stream->r_frame_rate.num; + //ulonglong targetTime = mkv.rawFrames[n].time * 1000000; + mkv_Seek(mkv.file,targetTime,MKVF_SEEK_TO_PREV_KEYFRAME); + + // Seek + if (mkv_ReadFrame(mkv.file,0,&rt,&startTime,&endTime,&filePos,&frameSize,&frameFlags) == 0) { + result = av_seek_frame(formatContext,vidStream,filePos,AVSEEK_FLAG_BYTE | AVSEEK_FLAG_BACKWARD); + int curpos = 0; + for (int i=0;i #include #include "video_provider.h" +#include "mkv_wrap.h" /////////////////////// // LibAVCodec provider class LAVCVideoProvider : public VideoProvider { private: + MatroskaWrapper mkv; + AVFormatContext *formatContext; AVCodecContext *codecContext; AVStream *stream; @@ -72,7 +75,7 @@ private: wxArrayInt bytePos; - bool isVFR; + bool isMkv; __int64 lastDecodeTime; int frameNumber; int length; diff --git a/docs/help.hm3 b/docs/help.hm3 index f8d17b359e160a3a83cf551e3b5c48382111c250..53e0252372b41871db0d9c96c0fd7b476135f4cf 100644 GIT binary patch delta 5578 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 BxlRB8 delta 2725 zcmb7`eNa@_6~N!U_uXZI1(&a76)X>2BRUioK_v*ylG0Wu)M(8IjdWVWcQh{ShbSn! zvM7?T0iWSG4JH~z+C)>zw)?1j1g0IQb}+$zQroc;oHYHT^()(~(`FERE=!mMXFBbh z`OUfaoO91T_uljFd)`U2cgWmTZfqcuG>aUhk|Z%n(zboUPmn>no5p&J#)|K6yhKnd z+2Z}p^4}9;yNueLE-Y1t*|A9F51NDgA>B8EiXp^={;%;cD!6n?hg-7i!%u#=`JYF3?V_7uRA3Sq}kUszZzN037Z1w0M@#{wHgl5IT)z`@x zm~LQC`|V?A3B(og6`<6Rc(6^$Ca~7C2>;Z0AObRSXo~9py&aaWB8khtzu)29ZLi;@ z)Yu(LUG?q;rK#Rkrv9W@gQCV4t+$P1ErR|3I}~OOH1e^N!5`VxM>E&1i80K^6CU^ zCL&3Q2$qa88(E4hLsF1bWH~h6CJ8aZWg~Vi$V%wGNz!28Hj$SKeGclZNG`G#$w$t^ zmD?nR_hIuG+`372=(l52c*E9Pq|RWU@7+g@`n#5*z+E!2k~eKTHbLN063r!>;a^GA zOBsV^6Ky6j5He8@DFt^j^%%@J`d)mv1fZmdo`&fcXcXLOVBb~kV|uur%*`-krg@|V zCQRJ_HH%UG@U9L9o*;?f9p=&L+p8-b)vj!1i`~AbTG_S7-sDv3>`h9&OKGw@b~&@> zszW{)6D7focD7Qr^+&?SHFQb8?GZ`>ne?YdI9*I%U&x^xUUO0%{AieGfb|nu2M-Eq ziTc@K?m}+b)dHGBwDCe}AnJ{C`GFUxjRcCQD}gkF`$=5raR>>q0^D1vhi<2EZwqZ* zFlwP~G$s*te##$%1|N;lUfV?n2{+E+)MTwb@RaYGKBj%RQDr4Lw=6DgS?AeKn_rKa3EU|vx!&kzoZt5z)&JH zZRQT$_c&3(y_R{%uONhi-lVWMkF}BnEtJQOWk6#-y8`z0EDrjfV{fQ&qs8KV^}$v% zeFerln10Tvq0tv@-iV)sBBU7k7V;QkL;7tsjP#VVO>otgVyV1B;I9z*{Wy0w?_B7aDpT_)Vkn2v4w|4n62;RE5cga1D0oeLJYeRoMsfk%owx_X5E9~jaKD6N z5<)_JY12Y4^Uyb8!c6hYGenPnc?ntq7x^TCzj??q)jP5*FvdTPktMgZQ%#qX10Qf3 z>6zp%`cDRXCwVJb386`h`VVkl;U2?1TvN;Z2cTz!A22JjB&8!6$O^=Qh@FDtBm5|t z?QZ-8N_@0PJMbaD7ZvMzes@bnjkTi2*;MazYTiHdv--%L4n^GYoeARSAR+KqzAp(H z|H9K@+J*If@;wH1y@nGIv3oCY3*Va4T d&pREJ6;<|1XNCA7$*y}bZ$1SD)A)Ze{RelG$kPA-