Skip to content

Commit

Permalink
winegstreamer: Don't flip RGB for Media Foundation clients
Browse files Browse the repository at this point in the history
  • Loading branch information
aeikum authored and ivyl committed Jul 27, 2022
1 parent 1b51201 commit d552e54
Show file tree
Hide file tree
Showing 7 changed files with 36 additions and 29 deletions.
2 changes: 1 addition & 1 deletion dlls/winegstreamer/gst_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ uint32_t wg_parser_get_stream_count(struct wg_parser *parser);
struct wg_parser_stream *wg_parser_get_stream(struct wg_parser *parser, uint32_t index);

void wg_parser_stream_get_preferred_format(struct wg_parser_stream *stream, struct wg_format *format);
void wg_parser_stream_enable(struct wg_parser_stream *stream, const struct wg_format *format);
void wg_parser_stream_enable(struct wg_parser_stream *stream, const struct wg_format *format, uint32_t flags);
void wg_parser_stream_disable(struct wg_parser_stream *stream);

bool wg_parser_stream_get_buffer(struct wg_parser_stream *stream, struct wg_parser_buffer *buffer);
Expand Down
3 changes: 2 additions & 1 deletion dlls/winegstreamer/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -179,12 +179,13 @@ void wg_parser_stream_get_preferred_format(struct wg_parser_stream *stream, stru
__wine_unix_call(unix_handle, unix_wg_parser_stream_get_preferred_format, &params);
}

void wg_parser_stream_enable(struct wg_parser_stream *stream, const struct wg_format *format)
void wg_parser_stream_enable(struct wg_parser_stream *stream, const struct wg_format *format, uint32_t flags)
{
struct wg_parser_stream_enable_params params =
{
.stream = stream,
.format = format,
.flags = flags,
};

TRACE("stream %p, format %p.\n", stream, format);
Expand Down
2 changes: 1 addition & 1 deletion dlls/winegstreamer/media_source.c
Original file line number Diff line number Diff line change
Expand Up @@ -358,7 +358,7 @@ static void start_pipeline(struct media_source *source, struct source_async_comm
IMFMediaTypeHandler_GetCurrentMediaType(mth, &current_mt);

mf_media_type_to_wg_format(current_mt, &format);
wg_parser_stream_enable(stream->wg_stream, &format);
wg_parser_stream_enable(stream->wg_stream, &format, 0);

IMFMediaType_Release(current_mt);
IMFMediaTypeHandler_Release(mth);
Expand Down
2 changes: 1 addition & 1 deletion dlls/winegstreamer/quartz_parser.c
Original file line number Diff line number Diff line change
Expand Up @@ -986,7 +986,7 @@ static HRESULT parser_init_stream(struct strmbase_filter *iface)
{
ret = amt_to_wg_format(&source->pin.pin.mt, &format);
assert(ret);
wg_parser_stream_enable(source->wg_stream, &format);
wg_parser_stream_enable(source->wg_stream, &format, STREAM_ENABLE_FLAG_FLIP_RGB);
}
else
{
Expand Down
3 changes: 3 additions & 0 deletions dlls/winegstreamer/unixlib.h
Original file line number Diff line number Diff line change
Expand Up @@ -207,10 +207,13 @@ struct wg_parser_stream_get_preferred_format_params
struct wg_format *format;
};

#define STREAM_ENABLE_FLAG_FLIP_RGB 0x1

struct wg_parser_stream_enable_params
{
struct wg_parser_stream *stream;
const struct wg_format *format;
uint32_t flags;
};

struct wg_parser_stream_get_buffer_params
Expand Down
47 changes: 25 additions & 22 deletions dlls/winegstreamer/wg_parser.c
Original file line number Diff line number Diff line change
Expand Up @@ -219,31 +219,34 @@ static NTSTATUS wg_parser_stream_enable(void *args)

if (format->major_type == WG_MAJOR_TYPE_VIDEO)
{
bool flip = (format->u.video.height < 0);

switch (format->u.video.format)
if (params->flags & STREAM_ENABLE_FLAG_FLIP_RGB)
{
case WG_VIDEO_FORMAT_BGRA:
case WG_VIDEO_FORMAT_BGRx:
case WG_VIDEO_FORMAT_BGR:
case WG_VIDEO_FORMAT_RGB15:
case WG_VIDEO_FORMAT_RGB16:
flip = !flip;
break;
bool flip = (format->u.video.height < 0);

case WG_VIDEO_FORMAT_AYUV:
case WG_VIDEO_FORMAT_I420:
case WG_VIDEO_FORMAT_NV12:
case WG_VIDEO_FORMAT_UYVY:
case WG_VIDEO_FORMAT_YUY2:
case WG_VIDEO_FORMAT_YV12:
case WG_VIDEO_FORMAT_YVYU:
case WG_VIDEO_FORMAT_UNKNOWN:
case WG_VIDEO_FORMAT_CINEPAK:
break;
}
switch (format->u.video.format)
{
case WG_VIDEO_FORMAT_BGRA:
case WG_VIDEO_FORMAT_BGRx:
case WG_VIDEO_FORMAT_BGR:
case WG_VIDEO_FORMAT_RGB15:
case WG_VIDEO_FORMAT_RGB16:
flip = !flip;
break;

gst_util_set_object_arg(G_OBJECT(stream->flip), "method", flip ? "vertical-flip" : "none");
case WG_VIDEO_FORMAT_AYUV:
case WG_VIDEO_FORMAT_I420:
case WG_VIDEO_FORMAT_NV12:
case WG_VIDEO_FORMAT_UYVY:
case WG_VIDEO_FORMAT_YUY2:
case WG_VIDEO_FORMAT_YV12:
case WG_VIDEO_FORMAT_YVYU:
case WG_VIDEO_FORMAT_UNKNOWN:
case WG_VIDEO_FORMAT_CINEPAK:
break;
}

gst_util_set_object_arg(G_OBJECT(stream->flip), "method", flip ? "vertical-flip" : "none");
}
}

gst_pad_push_event(stream->my_sink, gst_event_new_reconfigure());
Expand Down
6 changes: 3 additions & 3 deletions dlls/winegstreamer/wm_reader.c
Original file line number Diff line number Diff line change
Expand Up @@ -1520,7 +1520,7 @@ static HRESULT init_stream(struct wm_reader *reader, QWORD file_size)
stream->format.u.video.format = WG_VIDEO_FORMAT_BGRx;
}
}
wg_parser_stream_enable(stream->wg_stream, &stream->format);
wg_parser_stream_enable(stream->wg_stream, &stream->format, STREAM_ENABLE_FLAG_FLIP_RGB);
}

/* We probably discarded events because streams weren't enabled yet.
Expand Down Expand Up @@ -1798,7 +1798,7 @@ HRESULT wm_reader_set_output_props(struct wm_reader *reader, DWORD output,
}

stream->format = format;
wg_parser_stream_enable(stream->wg_stream, &format);
wg_parser_stream_enable(stream->wg_stream, &format, STREAM_ENABLE_FLAG_FLIP_RGB);

/* Re-decode any buffers that might have been generated with the old format.
*
Expand Down Expand Up @@ -2069,7 +2069,7 @@ HRESULT wm_reader_set_streams_selected(struct wm_reader *reader, WORD count,
FIXME("Ignoring selection %#x for stream %u; treating as enabled.\n",
selections[i], stream_numbers[i]);
TRACE("Enabling stream %u.\n", stream_numbers[i]);
wg_parser_stream_enable(stream->wg_stream, &stream->format);
wg_parser_stream_enable(stream->wg_stream, &stream->format, STREAM_ENABLE_FLAG_FLIP_RGB);
}
}

Expand Down

0 comments on commit d552e54

Please sign in to comment.