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;
}