diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6ee5bfcb13..de4e499c3b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -55,11 +55,11 @@ jobs: if: matrix.os == 'windows-latest' uses: msys2/setup-msys2@v2 with: - msystem: MINGW64 + msystem: UCRT64 install: >- - mingw-w64-x86_64-autotools - mingw-w64-x86_64-ffmpeg - mingw-w64-x86_64-toolchain + mingw-w64-ucrt-x86_64-autotools + mingw-w64-ucrt-x86_64-ffmpeg + mingw-w64-ucrt-x86_64-toolchain - name: configure run: ./autogen.sh --enable-static --disable-shared - name: make diff --git a/configure.ac b/configure.ac index f3075f57a0..56d5cc0135 100644 --- a/configure.ac +++ b/configure.ac @@ -6,7 +6,7 @@ AM_INIT_AUTOMAKE([1.11 subdir-objects]) AM_SILENT_RULES([yes]) AM_MAINTAINER_MODE([disable]) -VERSION_INFO="5:1:2" +VERSION_INFO="5:1:3" AC_MSG_CHECKING([if debug build is enabled]) diff --git a/doc/ffms2-api.md b/doc/ffms2-api.md index cdbdac4882..02721cf333 100644 --- a/doc/ffms2-api.md +++ b/doc/ffms2-api.md @@ -586,6 +586,18 @@ const char *FFMS_GetTrackMetadataI(FFMS_Indexer *Indexer, int Track, const char Returns the value of the metadata entry associated with `Key` for the given track number in the media file represented by the given `FFMS_Indexer` object. For the list of commonly used metadata keys, see the `metadata_api Public Metadata API` comment in [avformat.h](https://code.ffmpeg.org/FFmpeg/FFmpeg/src/branch/master/libavformat/avformat.h). +### FFMS_GetContainerFirstTimeI - gets the container first time + +[GetContainerFirstTimeI]: #ffms_getcontainerfirsttimei---gets-the-container-first-time +```c++ +int FFMS_GetContainerFirstTimeI(FFMS_Indexer *Indexer, int64_t *pts, int *timebase); +``` +Retrieves the container start time of the media file represented by the given `FFMS_Indexer` object. +On success, *pts* is set to the container start timestamp (which corresponds to `AVFormatContext::start_time` in FFmpeg) and *timebase* is set to the timebase it is expressed in. +Note that the *timebase* might be different than `FFMS_GetTimeBase`. +Returns 0 on success. +Returns non-0 on failure (e.g. if the container has no start time, or if *pts* or *timebase* is NULL). + ### FFMS_GetFormatNameI - gets the name of the container format used in the given indexer [GetFormatNameI]: #ffms_getformatnamei---gets-the-name-of-the-container-format-used-in-the-given-indexer diff --git a/doc/ffms2-changelog.md b/doc/ffms2-changelog.md index 9d065aa947..21b481cd49 100644 --- a/doc/ffms2-changelog.md +++ b/doc/ffms2-changelog.md @@ -4,6 +4,7 @@ - Added layered decoding support, for e.g. spatial MV-HEVC. - Added LastEndPTS to FFMS_VideoProperties. This field is the equivalent of LastEndTime, but it is expressed in the video timebase. - Added FFMS_GetTrackMetadataI. + - Added FFMS_GetContainerFirstTimeI. - 5.0 - Fixed all issues with FFmpeg 6.1 which is now the minimum requirement diff --git a/include/ffms.h b/include/ffms.h index 3f9d455117..5517376003 100644 --- a/include/ffms.h +++ b/include/ffms.h @@ -22,7 +22,7 @@ #define FFMS_H // Version format: major - minor - micro - bump -#define FFMS_VERSION ((5 << 24) | (1 << 16) | (2 << 8) | 0) +#define FFMS_VERSION ((5 << 24) | (1 << 16) | (3 << 8) | 0) #include #include @@ -462,7 +462,8 @@ FFMS_API(int) FFMS_GetTrackType(FFMS_Track *T); FFMS_API(int) FFMS_GetTrackTypeI(FFMS_Indexer *Indexer, int Track); FFMS_API(FFMS_IndexErrorHandling) FFMS_GetErrorHandling(FFMS_Index *Index); FFMS_API(const char *) FFMS_GetCodecNameI(FFMS_Indexer *Indexer, int Track); -FFMS_API(const char *) FFMS_GetTrackMetadataI(FFMS_Indexer *Indexer, int Track, const char *Key); +FFMS_API(const char *) FFMS_GetTrackMetadataI(FFMS_Indexer *Indexer, int Track, const char *Key); /* Introduced in FFMS_VERSION ((5 << 24) | (1 << 16) | (2 << 8) | 0) */ +FFMS_API(int) FFMS_GetContainerFirstTimeI(FFMS_Indexer *Indexer, int64_t *pts, int *timebase); /* Introduced in FFMS_VERSION ((5 << 24) | (1 << 16) | (3 << 8) | 0) */ FFMS_API(const char *) FFMS_GetFormatNameI(FFMS_Indexer *Indexer); FFMS_API(int) FFMS_GetNumFrames(FFMS_Track *T); FFMS_API(const FFMS_FrameInfo *) FFMS_GetFrameInfo(FFMS_Track *T, int Frame); diff --git a/src/core/ffms.cpp b/src/core/ffms.cpp index cbfe88e2a0..3340fdbe44 100644 --- a/src/core/ffms.cpp +++ b/src/core/ffms.cpp @@ -274,6 +274,10 @@ FFMS_API(const char *) FFMS_GetTrackMetadataI(FFMS_Indexer *Indexer, int Track, return Indexer->GetTrackMetadata(Track, Key); } +FFMS_API(int) FFMS_GetContainerFirstTimeI(FFMS_Indexer *Indexer, int64_t *pts, int *timebase) { + return Indexer->GetFirstTime(pts, timebase); +} + FFMS_API(int) FFMS_GetNumFrames(FFMS_Track *T) { return T->VisibleFrameCount(); } diff --git a/src/core/indexing.cpp b/src/core/indexing.cpp index 821ba053d9..40c7ca15bd 100644 --- a/src/core/indexing.cpp +++ b/src/core/indexing.cpp @@ -437,6 +437,16 @@ const char *FFMS_Indexer::GetTrackMetadata(int Track, const char *Key) { return Entry ? Entry->value : nullptr; } +int FFMS_Indexer::GetFirstTime(int64_t *pts, int *timebase) { + if (FormatContext->start_time == AV_NOPTS_VALUE || !pts || !timebase) + return 1; + + *pts = FormatContext->start_time; + *timebase = AV_TIME_BASE; + + return 0; +} + FFMS_Index *FFMS_Indexer::DoIndexing() { std::vector AVContexts(FormatContext->nb_streams); diff --git a/src/core/indexing.h b/src/core/indexing.h index 4a79e75ff9..e6ab861afb 100644 --- a/src/core/indexing.h +++ b/src/core/indexing.h @@ -101,6 +101,7 @@ struct FFMS_Indexer { FFMS_TrackType GetTrackType(int Track); const char *GetTrackCodec(int Track); const char *GetTrackMetadata(int Track, const char *Key); + int GetFirstTime(int64_t *pts, int *timebase); const char *GetFormatName(); };