static int decode_and_send_const(MPEGIDecodeStreamConnect* connect, const unsigned char* buffer, unsigned int bufferSize) { int finished; /* We know that avcodec_decode_video will not modify the input data, so we can cast buffer to non-const */ avcodec_decode_video(connect->decoder->dec, connect->decoder->decFrame, &finished, (unsigned char*)buffer, bufferSize); if (!finished) { ml_log_error("error decoding MPEG I-frame only video\n"); return 0; } /* reformat decoded frame to UYVY */ if (connect->decodedFormat == UYVY_FORMAT) { yuv422_to_uyvy(connect->streamInfo.width, connect->streamInfo.height, 0, connect->decoder->decFrame, connect->sinkBuffer); } else /* YUV422 */ { yuv422_to_yuv422(connect->streamInfo.width, connect->streamInfo.height, 0, connect->decoder->decFrame, connect->sinkBuffer); } /* send decoded frame to sink */ if (!msk_receive_stream_frame(connect->sink, connect->sinkStreamId, connect->sinkBuffer, connect->sinkBufferSize)) { ml_log_error("failed to write frame to media sink\n"); return 0; } return 1; }
static int decode_and_send_const(DVDecodeStreamConnect* connect, const unsigned char* buffer, unsigned int bufferSize) { int finished; /* We know that avcodec_decode_video will not modify the input data, so we can cast buffer to non-const */ avcodec_decode_video(connect->decoder->dec, connect->decoder->decFrame, &finished, (unsigned char*)buffer, bufferSize); if (!finished) { ml_log_error("error decoding DV video\n"); return 0; } /* reformat decoded frame */ if (connect->streamInfo.format == DV25_YUV420_FORMAT) { if (connect->decodedFormat == UYVY_FORMAT) { yuv4xx_to_uyvy(connect->streamInfo.width, connect->streamInfo.height, stream_is_pal_frame_rate(&connect->streamInfo), connect->decoder->decFrame, connect->sinkBuffer); } else /* YUV420 */ { yuv4xx_to_yuv4xx(connect->streamInfo.width, connect->streamInfo.height, stream_is_pal_frame_rate(&connect->streamInfo), connect->decoder->decFrame, connect->sinkBuffer); } } else if (connect->streamInfo.format == DV25_YUV411_FORMAT) { if (connect->decodedFormat == UYVY_FORMAT) { yuv4xx_to_uyvy(connect->streamInfo.width, connect->streamInfo.height, stream_is_pal_frame_rate(&connect->streamInfo), connect->decoder->decFrame, connect->sinkBuffer); } else /* YUV411 */ { yuv4xx_to_yuv4xx(connect->streamInfo.width, connect->streamInfo.height, stream_is_pal_frame_rate(&connect->streamInfo), connect->decoder->decFrame, connect->sinkBuffer); } } else /* DV50_FORMAT or DV100_FORMAT */ { if (connect->decodedFormat == UYVY_FORMAT) { yuv422_to_uyvy(connect->streamInfo.width, connect->streamInfo.height, stream_is_pal_frame_rate(&connect->streamInfo), connect->decoder->decFrame, connect->sinkBuffer); } else /* YUV422 */ { yuv422_to_yuv422(connect->streamInfo.width, connect->streamInfo.height, stream_is_pal_frame_rate(&connect->streamInfo), connect->decoder->decFrame, connect->sinkBuffer); } } /* send decoded frame to sink */ if (!msk_receive_stream_frame(connect->sink, connect->sinkStreamId, connect->sinkBuffer, connect->sinkBufferSize)) { ml_log_error("failed to write frame to media sink\n"); return 0; } return 1; }