|
|
@ -9,6 +9,7 @@ typedef struct ncvisual {
|
|
|
|
AVCodecContext* codecctx;
|
|
|
|
AVCodecContext* codecctx;
|
|
|
|
AVFrame* frame;
|
|
|
|
AVFrame* frame;
|
|
|
|
AVCodec* codec;
|
|
|
|
AVCodec* codec;
|
|
|
|
|
|
|
|
AVCodecParameters* cparams;
|
|
|
|
AVPacket* packet;
|
|
|
|
AVPacket* packet;
|
|
|
|
struct SwsContext* swsctx;
|
|
|
|
struct SwsContext* swsctx;
|
|
|
|
int packet_outstanding;
|
|
|
|
int packet_outstanding;
|
|
|
@ -30,6 +31,7 @@ void ncvisual_destroy(ncvisual* ncv){
|
|
|
|
avcodec_close(ncv->codecctx);
|
|
|
|
avcodec_close(ncv->codecctx);
|
|
|
|
avcodec_free_context(&ncv->codecctx);
|
|
|
|
avcodec_free_context(&ncv->codecctx);
|
|
|
|
av_frame_free(&ncv->frame);
|
|
|
|
av_frame_free(&ncv->frame);
|
|
|
|
|
|
|
|
avcodec_parameters_free(&ncv->cparams);
|
|
|
|
sws_freeContext(ncv->swsctx);
|
|
|
|
sws_freeContext(ncv->swsctx);
|
|
|
|
av_packet_free(&ncv->packet);
|
|
|
|
av_packet_free(&ncv->packet);
|
|
|
|
avformat_close_input(&ncv->fmtctx);
|
|
|
|
avformat_close_input(&ncv->fmtctx);
|
|
|
@ -37,6 +39,42 @@ void ncvisual_destroy(ncvisual* ncv){
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
|
|
|
print_frame_summary(const AVCodecContext* cctx, const AVFrame* f){
|
|
|
|
|
|
|
|
char pfmt[128];
|
|
|
|
|
|
|
|
av_get_pix_fmt_string(pfmt, sizeof(pfmt), f->format);
|
|
|
|
|
|
|
|
fprintf(stderr, "Frame %05d (%d? %d?) pfmt %d (%s) %lums@%lums (%skeyframe) qual: %d\n",
|
|
|
|
|
|
|
|
cctx->frame_number,
|
|
|
|
|
|
|
|
f->coded_picture_number,
|
|
|
|
|
|
|
|
f->display_picture_number,
|
|
|
|
|
|
|
|
f->format, pfmt,
|
|
|
|
|
|
|
|
f->pkt_duration, // FIXME in 'time_base' units
|
|
|
|
|
|
|
|
f->best_effort_timestamp,
|
|
|
|
|
|
|
|
f->key_frame ? "" : "non-",
|
|
|
|
|
|
|
|
f->quality);
|
|
|
|
|
|
|
|
fprintf(stderr, " Data (%d):", AV_NUM_DATA_POINTERS);
|
|
|
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i = 0 ; i < AV_NUM_DATA_POINTERS ; ++i){
|
|
|
|
|
|
|
|
fprintf(stderr, " %p", f->data[i]);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
fprintf(stderr, "\n Linesizes:");
|
|
|
|
|
|
|
|
for(i = 0 ; i < AV_NUM_DATA_POINTERS ; ++i){
|
|
|
|
|
|
|
|
fprintf(stderr, " %d", f->linesize[i]);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if(f->sample_aspect_ratio.num == 0 && f->sample_aspect_ratio.den == 1){
|
|
|
|
|
|
|
|
fprintf(stderr, "\n Aspect ratio unknown");
|
|
|
|
|
|
|
|
}else{
|
|
|
|
|
|
|
|
fprintf(stderr, "\n Aspect ratio %d:%d", f->sample_aspect_ratio.num, f->sample_aspect_ratio.den);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if(f->interlaced_frame){
|
|
|
|
|
|
|
|
fprintf(stderr, " [ILaced]");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if(f->palette_has_changed){
|
|
|
|
|
|
|
|
fprintf(stderr, " [NewPal]");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
fprintf(stderr, " PTS %ld Flags: 0x%04x\n", f->pts, f->flags);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
AVFrame* ncvisual_decode(struct ncvisual* nc){
|
|
|
|
AVFrame* ncvisual_decode(struct ncvisual* nc){
|
|
|
|
int ret;
|
|
|
|
int ret;
|
|
|
|
if(nc->packet_outstanding){
|
|
|
|
if(nc->packet_outstanding){
|
|
|
@ -54,8 +92,10 @@ AVFrame* ncvisual_decode(struct ncvisual* nc){
|
|
|
|
fprintf(stderr, "Error decoding AVPacket (%s)\n", av_err2str(ret));
|
|
|
|
fprintf(stderr, "Error decoding AVPacket (%s)\n", av_err2str(ret));
|
|
|
|
return NULL;
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
print_frame_summary(nc->codecctx, nc->frame);
|
|
|
|
|
|
|
|
return nc->frame;
|
|
|
|
#define IMGALLOCALIGN 32
|
|
|
|
#define IMGALLOCALIGN 32
|
|
|
|
fprintf(stderr, "Got frame %05d\n", nc->codecctx->frame_number);
|
|
|
|
/*
|
|
|
|
ret = av_image_alloc(nc->frame->data, nc->frame->linesize, nc->frame->width,
|
|
|
|
ret = av_image_alloc(nc->frame->data, nc->frame->linesize, nc->frame->width,
|
|
|
|
nc->frame->height, nc->frame->format, IMGALLOCALIGN);
|
|
|
|
nc->frame->height, nc->frame->format, IMGALLOCALIGN);
|
|
|
|
if(ret < 0){
|
|
|
|
if(ret < 0){
|
|
|
@ -98,6 +138,7 @@ AVFrame* ncvisual_decode(struct ncvisual* nc){
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#undef IMGALLOCALIGN
|
|
|
|
#undef IMGALLOCALIGN
|
|
|
|
return oframe;
|
|
|
|
return oframe;
|
|
|
|
|
|
|
|
*/
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ncvisual* ncplane_visual_open(struct ncplane* nc, const char* filename){
|
|
|
|
ncvisual* ncplane_visual_open(struct ncplane* nc, const char* filename){
|
|
|
@ -143,6 +184,14 @@ av_dump_format(ncv->fmtctx, 0, filename, false);
|
|
|
|
fprintf(stderr, "Couldn't open codec for %s (%s)\n", filename, av_err2str(ret));
|
|
|
|
fprintf(stderr, "Couldn't open codec for %s (%s)\n", filename, av_err2str(ret));
|
|
|
|
goto err;
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if((ncv->cparams = avcodec_parameters_alloc()) == NULL){
|
|
|
|
|
|
|
|
fprintf(stderr, "Couldn't allocate codec params for %s\n", filename);
|
|
|
|
|
|
|
|
goto err;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if((ret = avcodec_parameters_from_context(ncv->cparams, ncv->codecctx)) < 0){
|
|
|
|
|
|
|
|
fprintf(stderr, "Couldn't get codec params for %s (%s)\n", filename, av_err2str(ret));
|
|
|
|
|
|
|
|
goto err;
|
|
|
|
|
|
|
|
}
|
|
|
|
if((ret = avcodec_send_packet(ncv->codecctx, ncv->packet)) < 0){
|
|
|
|
if((ret = avcodec_send_packet(ncv->codecctx, ncv->packet)) < 0){
|
|
|
|
fprintf(stderr, "Error decoding packet from %s (%s)\n", filename,
|
|
|
|
fprintf(stderr, "Error decoding packet from %s (%s)\n", filename,
|
|
|
|
av_err2str(ret));
|
|
|
|
av_err2str(ret));
|
|
|
|