Libav FFv1 read_quant_table decoding errors

79 Views Asked by At

I am having trouble encoding and decoding video using the 'ffv1' codec. Interestingly when the width and height are ~640 or less, this works correctly, but with any "large" frame size such as 1280x720 I get the follow errors ...

[ffv1 @ 0x5612f4ab2240] read_quant_table error
[ffv1 @ 0x5612f4ab2240] Cannot decode non-keyframe without valid keyframe

Are there any options which need to be set, or am I doing something else incorrectly, I made the example very minimal, I am aware that I am not writing an image to the frame and simply allocating garbage in the buffers among other things. Thanks in advance.

// minimal example
// ...
#define FRAMES (500)

int main(int argc, char **argv)
{
    AVCodecContext *enc, *dec;
    AVFrame *frame = av_frame_alloc();
    AVFrame *decoded_frame = av_frame_alloc();
    AVPacket *packet = av_packet_alloc();
    AVPacket *padded_packet = av_packet_alloc();

    const AVCodec *enc_codec = avcodec_find_encoder_by_name("ffv1");
    const AVCodec *dec_codec = avcodec_find_decoder_by_name("ffv1");
    enc = avcodec_alloc_context3(enc_codec);
    dec = avcodec_alloc_context3(dec_codec);

    enc->width   = 1280;
    enc->height  = 720;
    enc->pix_fmt = AV_PIX_FMT_YUV420P;
    enc->time_base.num = 1001;
    enc->time_base.den = 60000;

    dec->width  = enc->width;
    dec->height = enc->height;

    avcodec_open2(enc, enc_codec, NULL);
    avcodec_open2(dec, dec_codec, NULL);

    frame->height = enc->height;
    frame->width  = enc->width;
    frame->format = enc->pix_fmt;
    av_frame_get_buffer(frame, 32);
    printf("frame linesz %i,%i,%i\n", frame->linesize[0], frame->linesize[1], frame->linesize[2]);

    for (int i = 0; i < FRAMES; ++i)
    {
        avcodec_send_frame(enc, frame);
        while (!avcodec_receive_packet(enc, packet))
        {
            av_new_packet(padded_packet, packet->size + AV_INPUT_BUFFER_PADDING_SIZE);
            padded_packet->size -= AV_INPUT_BUFFER_PADDING_SIZE;

            memset(padded_packet->data, 0, padded_packet->size);
            memcpy(padded_packet->data, packet->data, packet->size);
            printf("frame %i encoded %i bytes\n", i, padded_packet->size);
            if (!avcodec_send_packet(dec, padded_packet))
            {
                printf("sent bytes to decoder\n");
            }
        }

        while (!avcodec_receive_frame(dec, decoded_frame))
        {
            printf("decoded frame height %i, width %i\n", decoded_frame->height, decoded_frame->width);
        }
        usleep(16000);
    }
    return 0;
}
0

There are 0 best solutions below