- state = (*s->decoder)->DecodeFrame2(s->decoder, avpkt->data, avpkt->size, ptrs, &info);
+ if (!avpkt->data) {
+#if OPENH264_VER_AT_LEAST(1, 9)
+ int end_of_stream = 1;
+ (*s->decoder)->SetOption(s->decoder, DECODER_OPTION_END_OF_STREAM, &end_of_stream);
+ state = (*s->decoder)->FlushFrame(s->decoder, ptrs, &info);
+#else
+ return 0;
+#endif
+ } else {
+ info.uiInBsTimeStamp = avpkt->pts;
+#if OPENH264_VER_AT_LEAST(1, 4)
+ // Contrary to the name, DecodeFrameNoDelay actually does buffering
+ // and reordering of frames, and is the recommended decoding entry
+ // point since 1.4. This is essential for successfully decoding
+ // B-frames.
+ state = (*s->decoder)->DecodeFrameNoDelay(s->decoder, avpkt->data, avpkt->size, ptrs, &info);
+#else
+ state = (*s->decoder)->DecodeFrame2(s->decoder, avpkt->data, avpkt->size, ptrs, &info);
+#endif
+ }