static HRESULT WINAPI Gstreamer_AudioConvert_SetMediaType(TransformFilter *tf, PIN_DIRECTION dir, const AM_MEDIA_TYPE *amt) { GstTfImpl *This = (GstTfImpl*)tf; GstCaps *capsin, *capsout; AM_MEDIA_TYPE *outpmt = &This->tf.pmt; WAVEFORMATEX *inwfe; WAVEFORMATEX *outwfe; WAVEFORMATEXTENSIBLE *outwfx; GstAudioFormat format; HRESULT hr; BOOL inisfloat = FALSE; int indepth; TRACE("%p 0x%x %p\n", This, dir, amt); mark_wine_thread(); if (dir != PINDIR_INPUT) return S_OK; if (Gstreamer_AudioConvert_QueryConnect(&This->tf, amt) == S_FALSE || !amt->pbFormat) return E_FAIL; FreeMediaType(outpmt); *outpmt = *amt; outpmt->pUnk = NULL; outpmt->cbFormat = sizeof(WAVEFORMATEXTENSIBLE); outpmt->pbFormat = CoTaskMemAlloc(outpmt->cbFormat); inwfe = (WAVEFORMATEX*)amt->pbFormat; indepth = inwfe->wBitsPerSample; if (inwfe->wFormatTag == WAVE_FORMAT_EXTENSIBLE) { WAVEFORMATEXTENSIBLE *inwfx = (WAVEFORMATEXTENSIBLE*)inwfe; inisfloat = IsEqualGUID(&inwfx->SubFormat, &KSDATAFORMAT_SUBTYPE_IEEE_FLOAT); if (inwfx->Samples.wValidBitsPerSample) indepth = inwfx->Samples.wValidBitsPerSample; } else if (inwfe->wFormatTag == WAVE_FORMAT_IEEE_FLOAT) inisfloat = TRUE; if (inisfloat) format = inwfe->wBitsPerSample == 64 ? GST_AUDIO_FORMAT_F64LE : GST_AUDIO_FORMAT_F32LE; else format = gst_audio_format_build_integer(inwfe->wBitsPerSample != 8, G_LITTLE_ENDIAN, inwfe->wBitsPerSample, indepth); capsin = gst_caps_new_simple("audio/x-raw", "format", G_TYPE_STRING, gst_audio_format_to_string(format), "channels", G_TYPE_INT, inwfe->nChannels, "rate", G_TYPE_INT, inwfe->nSamplesPerSec, NULL); outwfe = (WAVEFORMATEX*)outpmt->pbFormat; outwfx = (WAVEFORMATEXTENSIBLE*)outwfe; outwfe->wFormatTag = WAVE_FORMAT_EXTENSIBLE; outwfe->nChannels = 2; outwfe->nSamplesPerSec = inwfe->nSamplesPerSec; outwfe->wBitsPerSample = 16; outwfe->nBlockAlign = outwfe->nChannels * outwfe->wBitsPerSample / 8; outwfe->nAvgBytesPerSec = outwfe->nBlockAlign * outwfe->nSamplesPerSec; outwfe->cbSize = sizeof(*outwfx) - sizeof(*outwfe); outwfx->Samples.wValidBitsPerSample = outwfe->wBitsPerSample; outwfx->dwChannelMask = SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT; outwfx->SubFormat = KSDATAFORMAT_SUBTYPE_PCM; capsout = gst_caps_new_simple("audio/x-raw", "format", G_TYPE_STRING, "S16LE", "channels", G_TYPE_INT, outwfe->nChannels, "rate", G_TYPE_INT, outwfe->nSamplesPerSec, NULL); hr = Gstreamer_transform_ConnectInput(This, amt, capsin, capsout); gst_caps_unref(capsin); gst_caps_unref(capsout); This->cbBuffer = inwfe->nAvgBytesPerSec; return hr; }
static HRESULT WINAPI Gstreamer_AudioConvert_SetMediaType(TransformFilter *tf, PIN_DIRECTION dir, const AM_MEDIA_TYPE *amt) { GstTfImpl *This = (GstTfImpl*)tf; GstCaps *capsin, *capsout; AM_MEDIA_TYPE *outpmt = &This->tf.pmt; WAVEFORMATEX *inwfe; WAVEFORMATEX *outwfe; WAVEFORMATEXTENSIBLE *outwfx; HRESULT hr; int inisfloat = 0, indepth; if (dir != PINDIR_INPUT) return S_OK; if (Gstreamer_AudioConvert_QueryConnect(&This->tf, amt) == S_FALSE || !amt->pbFormat) return E_FAIL; FreeMediaType(outpmt); *outpmt = *amt; outpmt->pUnk = NULL; outpmt->cbFormat = sizeof(WAVEFORMATEXTENSIBLE); outpmt->pbFormat = CoTaskMemAlloc(outpmt->cbFormat); inwfe = (WAVEFORMATEX*)amt->pbFormat; indepth = inwfe->wBitsPerSample; if (inwfe->wFormatTag == WAVE_FORMAT_EXTENSIBLE) { WAVEFORMATEXTENSIBLE *inwfx = (WAVEFORMATEXTENSIBLE*)inwfe; inisfloat = IsEqualGUID(&inwfx->SubFormat, &KSDATAFORMAT_SUBTYPE_IEEE_FLOAT); if (inwfx->Samples.wValidBitsPerSample) indepth = inwfx->Samples.wValidBitsPerSample; } capsin = gst_caps_new_simple(inisfloat ? "audio/x-raw-float" : "audio/x-raw-int", "endianness", G_TYPE_INT, 1234, "width", G_TYPE_INT, inwfe->wBitsPerSample, "depth", G_TYPE_INT, indepth, "channels", G_TYPE_INT, inwfe->nChannels, "rate", G_TYPE_INT, inwfe->nSamplesPerSec, NULL); outwfe = (WAVEFORMATEX*)outpmt->pbFormat; outwfx = (WAVEFORMATEXTENSIBLE*)outwfe; outwfe->wFormatTag = WAVE_FORMAT_EXTENSIBLE; outwfe->nChannels = 2; outwfe->nSamplesPerSec = inwfe->nSamplesPerSec; outwfe->wBitsPerSample = 16; outwfe->nBlockAlign = outwfe->nChannels * outwfe->wBitsPerSample / 8; outwfe->nAvgBytesPerSec = outwfe->nBlockAlign * outwfe->nSamplesPerSec; outwfe->cbSize = sizeof(*outwfx) - sizeof(*outwfe); outwfx->Samples.wValidBitsPerSample = outwfe->wBitsPerSample; outwfx->dwChannelMask = SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT; outwfx->SubFormat = KSDATAFORMAT_SUBTYPE_PCM; capsout = gst_caps_new_simple("audio/x-raw-int", "endianness", G_TYPE_INT, 1234, "width", G_TYPE_INT, outwfe->wBitsPerSample, "depth", G_TYPE_INT, outwfx->Samples.wValidBitsPerSample, "channels", G_TYPE_INT, outwfe->nChannels, "rate", G_TYPE_INT, outwfe->nSamplesPerSec, NULL); hr = Gstreamer_transform_ConnectInput(This, amt, capsin, capsout); FIXME("%08x\n", hr); gst_caps_unref(capsin); gst_caps_unref(capsout); This->cbBuffer = inwfe->nAvgBytesPerSec; return hr; }