On Fri, 10 Dec 2021 19:34:25 GMT, Kevin Rushforth <k...@openjdk.org> wrote:

>> Alexander Matveev has updated the pull request incrementally with one 
>> additional commit since the last revision:
>> 
>>   8273096: Add support for H.265/HEVC to JavaFX Media [v3]
>
> modules/javafx.media/src/main/native/gstreamer/plugins/mfwrapper/mfwrapper.cpp
>  line 313:
> 
>> 311:     default:
>> 312:         break;
>> 313:     }
> 
> This block is a no-op. Is this intended? (and if so, is it needed?)

Actually mfwrapper_change_state() is not needed, since it is not used at all. 
Default handler should be just fine. It was copy-paste from dshowwrapper when I 
created this element and forgot to remove it. In dshowwrapper it is used. I 
will remove this function.

> modules/javafx.media/src/main/native/gstreamer/plugins/mfwrapper/mfwrapper.cpp
>  line 517:
> 
>> 515:     do
>> 516:     {
>> 517:         hr = decoder->pDecoder->GetOutputAvailableType(0, dwTypeIndex, 
>> &pDecoderOutputType);
> 
> Do you need to check `SUCCEEDED(hr)` here?

No checks below should handle it in case if it fails.

> modules/javafx.media/src/main/native/gstreamer/plugins/mfwrapper/mfwrapper.cpp
>  line 571:
> 
>> 569:         SafeRelease(&pDecoderOutputType);
>> 570: 
>> 571:     } while (hr != MF_E_NO_MORE_TYPES && hr != S_OK);
> 
> Should this be `FAILED(hr)` instead of `hr != S_OK`? Also, is it guaranteed 
> to get success or `MF_E_NO_MORE_TYPES`? If not, this could lead to an 
> infinite loop.

Fixed. Yes, it should be FAILED(hr) and it is not guaranteed to get success or 
MF_E_NO_MORE_TYPES.

> modules/javafx.media/src/main/native/gstreamer/plugins/mfwrapper/mfwrapper.cpp
>  line 577:
> 
>> 575:     do
>> 576:     {
>> 577:         hr = decoder->pColorConvert->GetOutputAvailableType(0, 
>> dwTypeIndex, &pConverterOutputType);
> 
> Same questions for this loop as for the previous.

Fixed as well.

> modules/javafx.media/src/main/native/gstreamer/plugins/mfwrapper/mfwrapper.cpp
>  line 684:
> 
>> 682:         return FALSE;
>> 683:     }
>> 684:     else if (hr == MF_E_TRANSFORM_STREAM_CHANGE)
> 
> Is it OK that this case will return FALSE always?

Yes, we return TRUE only if we got output from converter which is ready to be 
delivered. MF_E_TRANSFORM_STREAM_CHANGE is needed to reconfigure converter. I 
removed MF_E_TRANSFORM_NEED_MORE_INPUT since it is not needed.

> modules/javafx.media/src/main/native/gstreamer/plugins/mfwrapper/mfwrapper.cpp
>  line 723:
> 
>> 721: 
>> 722:     if (SUCCEEDED(hr))
>> 723:         hr = pMediaBuffer->Lock(&pBuffer, &cbMaxLength, 
>> &cbCurrentLength);
> 
> If this succeeds, but later operations fail, it seems possible that Unlock 
> won't be called in some cases. Might this cause a problem?

It can cause a problem, but it should be called, since nothing will change hr 
value between Lock/Unlock. I will remove unnecessary check of hr value before 
unlock. It will only miss unlock if cbCurrentLength == 0, which can happen for 
empty buffers, but unlikely. I will fix it as well.

> modules/javafx.media/src/main/native/gstreamer/plugins/mfwrapper/mfwrapper.cpp
>  line 730:
> 
>> 728:         GstMapInfo info;
>> 729: 
>> 730:         if (!gst_buffer_map(pGstBuffer, &info, GST_MAP_WRITE))
> 
> Do you need to check for `pGstBuffer == NULL`? My concern is that either 
> `gst_buffer_map` will crash if it is, or else it return NULL and then 
> `gst_buffer_unref` might crash.

Yes, we should. I fixed it.

> modules/javafx.media/src/main/native/gstreamer/plugins/mfwrapper/mfwrapper.cpp
>  line 791:
> 
>> 789:         return PO_FLUSHING;
>> 790: 
>> 791:     HRESULT hr = decoder->pDecoder->GetOutputStatus(&dwFlags);
> 
> Do you not need to check `hr` here?

Yes, fixed.

> modules/javafx.media/src/main/native/gstreamer/plugins/mfwrapper/mfwrapper.cpp
>  line 811:
> 
>> 809:             do
>> 810:             {
>> 811:                 hr = decoder->pDecoder->GetOutputAvailableType(0, 
>> dwTypeIndex, &pOutputType);
> 
> Same question as earlier loops -- do you need to check `hr` (from previous 
> time through loop) here?

Fixed as well.

> modules/javafx.media/src/main/native/gstreamer/plugins/mfwrapper/mfwrapper.cpp
>  line 963:
> 
>> 961:         // Ask decoder to produce all remaining data
>> 962:         if (SUCCEEDED(hr))
>> 963:             hr = 
>> decoder->pDecoder->ProcessMessage(MFT_MESSAGE_COMMAND_DRAIN, 0);
> 
> Does this `hr` need to be checked?

No, I removed it. I think we still need to attempt reading data from decoder, 
even if it refused DRAIN which asks decoder to produce all output it can 
possible produce without any additional input.

> modules/javafx.media/src/main/native/gstreamer/plugins/mfwrapper/mfwrapper.cpp
>  line 1101:
> 
>> 1099: 
>> 1100:     // Get array count
>> 1101:     arrayCount = *(guint8*)bdata;
> 
> Should this count be sanity checked?

No, checks for in_bytes_count and out_bytes_count seems to handle any bad 
values for arrayCount, nalUnitsCount or nalUnitLength just fine. I tested it 
under debugger by modifying these variables.

> modules/javafx.media/src/main/native/gstreamer/plugins/mfwrapper/mfwrapper.cpp
>  line 1346:
> 
>> 1344:     default:
>> 1345:         break;
>> 1346:     }
> 
> This is a no-op. Is it intended?

No, mfwrapper_src_query() is not needed. Removed. Same for 
mfwrapper_src_event().

-------------

PR: https://git.openjdk.java.net/jfx/pull/649

Reply via email to