From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winedmo/main.c | 16 ++++++++++++++++ dlls/winedmo/unix_demuxer.c | 18 ++++++++++++++++++ dlls/winedmo/unix_private.h | 1 + dlls/winedmo/unixlib.c | 2 ++ dlls/winedmo/unixlib.h | 7 +++++++ dlls/winedmo/winedmo.spec | 1 + include/wine/winedmo.h | 1 + 7 files changed, 46 insertions(+)
diff --git a/dlls/winedmo/main.c b/dlls/winedmo/main.c index 381211b396f..ccb8a4eb95d 100644 --- a/dlls/winedmo/main.c +++ b/dlls/winedmo/main.c @@ -180,6 +180,22 @@ NTSTATUS CDECL winedmo_demuxer_destroy( struct winedmo_demuxer *demuxer ) return status; }
+NTSTATUS CDECL winedmo_demuxer_seek( struct winedmo_demuxer demuxer, INT64 timestamp ) +{ + struct demuxer_seek_params params = {.demuxer = demuxer, .timestamp = timestamp}; + NTSTATUS status; + + TRACE( "demuxer %#I64x, timestamp %I64d\n", demuxer.handle, timestamp ); + + if ((status = UNIX_CALL( demuxer_seek, ¶ms ))) + { + WARN( "Failed to set position, status %#lx\n", status ); + return status; + } + + return STATUS_SUCCESS; +} + NTSTATUS CDECL winedmo_demuxer_stream_lang( struct winedmo_demuxer demuxer, UINT stream, WCHAR *buffer, UINT len ) { struct demuxer_stream_lang_params params = {.demuxer = demuxer, .stream = stream}; diff --git a/dlls/winedmo/unix_demuxer.c b/dlls/winedmo/unix_demuxer.c index 70f9e0715f6..e14431e6d9c 100644 --- a/dlls/winedmo/unix_demuxer.c +++ b/dlls/winedmo/unix_demuxer.c @@ -159,6 +159,24 @@ NTSTATUS demuxer_destroy( void *arg ) return STATUS_SUCCESS; }
+NTSTATUS demuxer_seek( void *arg ) +{ + struct demuxer_seek_params *params = arg; + AVFormatContext *ctx = get_demuxer( params->demuxer ); + int64_t timestamp = params->timestamp * AV_TIME_BASE / 10000000; + int ret; + + TRACE( "context %p, timestamp 0x%s\n", ctx, wine_dbgstr_longlong( params->timestamp ) ); + + if ((ret = av_seek_frame( ctx, -1, timestamp, AVSEEK_FLAG_ANY )) < 0) + { + ERR( "Failed to seek context %p, error %s.\n", ctx, debugstr_averr(ret) ); + return STATUS_UNSUCCESSFUL; + } + + return STATUS_SUCCESS; +} + NTSTATUS demuxer_stream_lang( void *arg ) { struct demuxer_stream_lang_params *params = arg; diff --git a/dlls/winedmo/unix_private.h b/dlls/winedmo/unix_private.h index 8a282c23148..77aa9058350 100644 --- a/dlls/winedmo/unix_private.h +++ b/dlls/winedmo/unix_private.h @@ -43,6 +43,7 @@ extern int unix_read_callback( void *opaque, uint8_t *buffer, int size ); extern NTSTATUS demuxer_check( void * ); extern NTSTATUS demuxer_create( void * ); extern NTSTATUS demuxer_destroy( void * ); +extern NTSTATUS demuxer_seek( void * ); extern NTSTATUS demuxer_stream_lang( void * ); extern NTSTATUS demuxer_stream_name( void * ); extern NTSTATUS demuxer_stream_type( void * ); diff --git a/dlls/winedmo/unixlib.c b/dlls/winedmo/unixlib.c index 8398c8f143a..119853ec457 100644 --- a/dlls/winedmo/unixlib.c +++ b/dlls/winedmo/unixlib.c @@ -132,6 +132,7 @@ const unixlib_entry_t __wine_unix_call_funcs[] = X( demuxer_check ), X( demuxer_create ), X( demuxer_destroy ), + X( demuxer_seek ), X( demuxer_stream_lang ), X( demuxer_stream_name ), X( demuxer_stream_type ), @@ -193,6 +194,7 @@ const unixlib_entry_t __wine_unix_call_wow64_funcs[] = X( demuxer_check ), X64( demuxer_create ), X64( demuxer_destroy ), + X( demuxer_seek ), X( demuxer_stream_lang ), X( demuxer_stream_name ), X( demuxer_stream_type ), diff --git a/dlls/winedmo/unixlib.h b/dlls/winedmo/unixlib.h index d7dc1a2e2fd..fd250e58209 100644 --- a/dlls/winedmo/unixlib.h +++ b/dlls/winedmo/unixlib.h @@ -98,6 +98,12 @@ struct demuxer_destroy_params struct stream_context *context; };
+struct demuxer_seek_params +{ + struct winedmo_demuxer demuxer; + INT64 timestamp; +}; + struct demuxer_stream_lang_params { struct winedmo_demuxer demuxer; @@ -127,6 +133,7 @@ enum unix_funcs unix_demuxer_check, unix_demuxer_create, unix_demuxer_destroy, + unix_demuxer_seek, unix_demuxer_stream_lang, unix_demuxer_stream_name, unix_demuxer_stream_type, diff --git a/dlls/winedmo/winedmo.spec b/dlls/winedmo/winedmo.spec index 0da65562406..77772b1f472 100644 --- a/dlls/winedmo/winedmo.spec +++ b/dlls/winedmo/winedmo.spec @@ -1,6 +1,7 @@ @ cdecl winedmo_demuxer_check(str) @ cdecl winedmo_demuxer_create(wstr ptr int64 ptr ptr ptr ptr) @ cdecl winedmo_demuxer_destroy(ptr) +@ cdecl winedmo_demuxer_seek(int64 int64) @ cdecl winedmo_demuxer_stream_lang(int64 long ptr long) @ cdecl winedmo_demuxer_stream_name(int64 long ptr long) @ cdecl winedmo_demuxer_stream_type(int64 long ptr ptr) diff --git a/include/wine/winedmo.h b/include/wine/winedmo.h index 843640c8107..f4f9d1371d4 100644 --- a/include/wine/winedmo.h +++ b/include/wine/winedmo.h @@ -46,6 +46,7 @@ NTSTATUS CDECL winedmo_demuxer_check( const char *mime_type ); NTSTATUS CDECL winedmo_demuxer_create( const WCHAR *url, struct winedmo_stream *stream, UINT64 stream_size, INT64 *duration, UINT *stream_count, WCHAR *mime_type, struct winedmo_demuxer *demuxer ); NTSTATUS CDECL winedmo_demuxer_destroy( struct winedmo_demuxer *demuxer ); +NTSTATUS CDECL winedmo_demuxer_seek( struct winedmo_demuxer demuxer, INT64 timestamp ); NTSTATUS CDECL winedmo_demuxer_stream_lang( struct winedmo_demuxer demuxer, UINT stream, WCHAR *buffer, UINT len ); NTSTATUS CDECL winedmo_demuxer_stream_name( struct winedmo_demuxer demuxer, UINT stream, WCHAR *buffer, UINT len ); NTSTATUS CDECL winedmo_demuxer_stream_type( struct winedmo_demuxer demuxer, UINT stream,