[Libav-user] decoding video frames
Bob Self
bobslf at gmail.com
Thu May 10 14:43:36 CEST 2012
I'm trying to decode video frames. The decoding loop prints this message:
[mpeg4 @ 00823420] Invalid and inefficient vfw-avi packed B
frames detected
After that it prints these lines over and over:
[mpeg4 @ ...] slice end not reached but screenspace end (5 left
78000, score= -2)
[mpeg4 @ ...] concealing 1350 DC, 1350 AC, 1350 MV errors
What causes these warning messages? Is this the correct way to decode video?
thanks,
Bob
AVCodec *codec;
AVCodecContext *codec_ctx= NULL;
AVFormatContext *format_ctx=NULL;
AVFrame *picture=NULL;
int frame, got_picture, len;
FILE *f;
uint8_t inbuf[INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE];
char buf[1024];
AVPacket avpkt;
const char *outfilename = "x.x";
const char *filename = MOVIE;
unsigned long frames=0L;
int status;
int64_t duration = 0;
const char *cptr=NULL;
unsigned long count=0L;
unsigned long total_bytes = 0L;
int vidstream = -1;
int i;
int flags=0;
if (!exists(MOVIE)) {
printf("can't find %s\n", MOVIE);
exit 1;
}
av_log_set_flags(AV_LOG_SKIP_REPEATED);
avcodec_register_all();
av_register_all();
avformat_network_init();
unsigned int codec_version = avcodec_version();
av_init_packet(&avpkt);
// avcodec version: 54.10.100
printf("avcodec version = %d.%d.%d\n", (codec_version&0x00ff0000)>>16,
(codec_version&0x0000ff00)>>8, codec_version&0x000000ff); //
version 52.72.2
format_ctx = avformat_alloc_context();
cptr = MOVIE;
status = avformat_open_input(&format_ctx, MOVIE, NULL, NULL);
if (status != 0) {
printf("error1\n");
goto done;
}
// find the first video stream
for (i=0; i<(int)format_ctx->nb_streams; i++) {
if (format_ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
vidstream = i;
break;
}
}
if (vidstream == -1) {
printf("error3\n");
goto done;
}
// Get a pointer to the codec context for the video stream
codec_ctx = format_ctx->streams[vidstream]->codec;
frames = (unsigned long)format_ctx->streams[vidstream]->nb_frames; // 154959
double d;
d = frames / 23.97; // d = 5170
d /= 3600.0; // d = 1.79 hours
memset(inbuf + INBUF_SIZE, 0, FF_INPUT_BUFFER_PADDING_SIZE);
codec = avcodec_find_decoder(CODEC_ID_MPEG4);
if (!codec) {
fprintf(stderr, "codec not found\n");
goto done;
}
codec_ctx = avcodec_alloc_context3(codec);
picture= avcodec_alloc_frame();
if(codec->capabilities&CODEC_CAP_TRUNCATED) {
codec_ctx->flags|= CODEC_FLAG_TRUNCATED; // we do not
send complete frames
}
if (avcodec_open2(codec_ctx, codec, NULL) < 0) {
fprintf(stderr, "could not open codec\n");
goto done;
}
f = fopen(filename, "rb");
if (!f) {
fprintf(stderr, "could not open %s\n", filename);
goto done;
}
frame = 0;
while(1) {
avpkt.size = fread(inbuf, 1, INBUF_SIZE, f);
count++;
total_bytes += avpkt.size;
if (avpkt.size == 0) {
break;
}
avpkt.data = inbuf;
while (avpkt.size > 0) {
len = avcodec_decode_video2(codec_ctx, picture, &got_picture, &avpkt);
if (len < 0) {
fclose(f);
printf("Error while decoding frame %d, count = %ld,
total_bytes = %ld\n", frame, count, total_bytes);
goto done;
}
if (got_picture) {
frame++;
if ((frame%100)==0) {
printf("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
%d\n", frame);
}
}
avpkt.size -= len;
avpkt.data += len;
} // while (avpkt.size > 0)
} // while(1)
avpkt.data = NULL;
avpkt.size = 0;
done:
FCLOSE(f);
if (format_ctx) {
//av_close_input_file(format_ctx);
avformat_free_context(format_ctx);
}
if (codec_ctx) {
avcodec_close(codec_ctx);
av_free(codec_ctx);
}
if (picture) {
av_free(picture);
}
More information about the Libav-user
mailing list