From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winedmo/main.c | 18 ++++++++++++++++++ dlls/winedmo/unix_demuxer.c | 16 ++++++++++++++++ dlls/winedmo/unix_private.h | 1 + dlls/winedmo/unixlib.c | 2 ++ dlls/winedmo/unixlib.h | 8 ++++++++ dlls/winedmo/winedmo.spec | 1 + include/wine/winedmo.h | 1 + 7 files changed, 47 insertions(+)
diff --git a/dlls/winedmo/main.c b/dlls/winedmo/main.c index 2f16120796d..381211b396f 100644 --- a/dlls/winedmo/main.c +++ b/dlls/winedmo/main.c @@ -180,6 +180,24 @@ NTSTATUS CDECL winedmo_demuxer_destroy( struct winedmo_demuxer *demuxer ) return status; }
+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}; + NTSTATUS status; + + TRACE( "demuxer %#I64x, stream %u\n", demuxer.handle, stream ); + + if ((status = UNIX_CALL( demuxer_stream_lang, ¶ms ))) + { + WARN( "Failed to get stream lang, status %#lx\n", status ); + return status; + } + + len = MultiByteToWideChar( CP_UTF8, 0, params.buffer, -1, buffer, len ); + buffer[len - 1] = 0; + return STATUS_SUCCESS; +} + NTSTATUS CDECL winedmo_demuxer_stream_name( struct winedmo_demuxer demuxer, UINT stream, WCHAR *buffer, UINT len ) { struct demuxer_stream_name_params params = {.demuxer = demuxer, .stream = stream}; diff --git a/dlls/winedmo/unix_demuxer.c b/dlls/winedmo/unix_demuxer.c index d4064b0fc0f..70f9e0715f6 100644 --- a/dlls/winedmo/unix_demuxer.c +++ b/dlls/winedmo/unix_demuxer.c @@ -159,6 +159,22 @@ NTSTATUS demuxer_destroy( void *arg ) return STATUS_SUCCESS; }
+NTSTATUS demuxer_stream_lang( void *arg ) +{ + struct demuxer_stream_lang_params *params = arg; + AVFormatContext *ctx = get_demuxer( params->demuxer ); + AVStream *stream = ctx->streams[params->stream]; + AVDictionaryEntry *tag; + + TRACE( "context %p, stream %u\n", ctx, params->stream ); + + if (!(tag = av_dict_get( stream->metadata, "language", NULL, AV_DICT_IGNORE_SUFFIX ))) + return STATUS_NOT_FOUND; + + lstrcpynA( params->buffer, tag->value, ARRAY_SIZE( params->buffer ) ); + return STATUS_SUCCESS; +} + NTSTATUS demuxer_stream_name( void *arg ) { struct demuxer_stream_name_params *params = arg; diff --git a/dlls/winedmo/unix_private.h b/dlls/winedmo/unix_private.h index 1bb73efeb99..8a282c23148 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_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 57318e864e0..8398c8f143a 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_stream_lang ), X( demuxer_stream_name ), X( demuxer_stream_type ), }; @@ -192,6 +193,7 @@ const unixlib_entry_t __wine_unix_call_wow64_funcs[] = X( demuxer_check ), X64( demuxer_create ), X64( demuxer_destroy ), + 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 2f1d1016fd2..d7dc1a2e2fd 100644 --- a/dlls/winedmo/unixlib.h +++ b/dlls/winedmo/unixlib.h @@ -98,6 +98,13 @@ struct demuxer_destroy_params struct stream_context *context; };
+struct demuxer_stream_lang_params +{ + struct winedmo_demuxer demuxer; + UINT32 stream; + char buffer[32]; +}; + struct demuxer_stream_name_params { struct winedmo_demuxer demuxer; @@ -120,6 +127,7 @@ enum unix_funcs unix_demuxer_check, unix_demuxer_create, unix_demuxer_destroy, + 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 991efb52164..0da65562406 100644 --- a/dlls/winedmo/winedmo.spec +++ b/dlls/winedmo/winedmo.spec @@ -1,5 +1,6 @@ @ cdecl winedmo_demuxer_check(str) @ cdecl winedmo_demuxer_create(wstr ptr int64 ptr ptr ptr ptr) @ cdecl winedmo_demuxer_destroy(ptr) +@ 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 c1aa2c2255c..843640c8107 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_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, GUID *major, union winedmo_format **format );