video works all the way now :D #94

pull/98/head
nick black 5 years ago committed by Nick Black
parent 56e637d006
commit b59d9c633f

@ -68,35 +68,40 @@ print_frame_summary(const AVCodecContext* cctx, const AVFrame* f){
}
AVFrame* ncvisual_decode(struct ncvisual* nc, int* averr){
bool have_frame = false;
bool unref = false;
do{
if(nc->packet_outstanding){
break;
do{
if(nc->packet_outstanding){
break;
}
if(unref){
// fprintf(stderr, "stream index %d != %d\n", nc->packet->stream_index, nc->stream_index);
av_packet_unref(nc->packet);
}
if((*averr = av_read_frame(nc->fmtctx, nc->packet)) < 0){
fprintf(stderr, "Error reading frame info (%s)\n", av_err2str(*averr));
return NULL;
}
unref = true;
}while(nc->packet->stream_index != nc->stream_index);
++nc->packet_outstanding;
*averr = avcodec_send_packet(nc->codecctx, nc->packet);
if(*averr < 0){
fprintf(stderr, "Error processing AVPacket (%s)\n", av_err2str(*averr));
return ncvisual_decode(nc, averr);
}
if(unref){
// fprintf(stderr, "stream index %d != %d\n", nc->packet->stream_index, nc->stream_index);
av_packet_unref(nc->packet);
}
if((*averr = av_read_frame(nc->fmtctx, nc->packet)) < 0){
fprintf(stderr, "Error reading frame info (%s)\n", av_err2str(*averr));
--nc->packet_outstanding;
*averr = avcodec_receive_frame(nc->codecctx, nc->frame);
if(*averr >= 0){
have_frame = true;
}else if(*averr == AVERROR(EAGAIN) || *averr == AVERROR_EOF){
have_frame = false;
}else if(*averr < 0){
fprintf(stderr, "Error decoding AVPacket (%s)\n", av_err2str(*averr));
return NULL;
}
unref = true;
}while(nc->packet->stream_index != nc->stream_index);
++nc->packet_outstanding;
*averr = avcodec_send_packet(nc->codecctx, nc->packet);
if(*averr < 0){
fprintf(stderr, "Error processing AVPacket (%s)\n", av_err2str(*averr));
return ncvisual_decode(nc, averr);
}
--nc->packet_outstanding;
*averr = avcodec_receive_frame(nc->codecctx, nc->frame);
if(*averr == AVERROR(EAGAIN) || *averr == AVERROR_EOF){
return NULL; // FIXME do something smarter
}else if(*averr < 0){
fprintf(stderr, "Error decoding AVPacket (%s)\n", av_err2str(*averr));
return NULL;
}
}while(!have_frame);
print_frame_summary(nc->codecctx, nc->frame);
#define IMGALLOCALIGN 32
const int targformat = AV_PIX_FMT_RGBA;

Loading…
Cancel
Save