static int decode_and_send_const(DNxHDDecodeStreamConnect* 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("Failed to decode DNxHD video\n");
        return 0;
    }

    /* reformat decoded frame */
    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;
}
Beispiel #2
0
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;
}