extract ffmpeg_resize_internal(), call from ffmpeg_blit() #1718

pull/1727/head
nick black 3 years ago committed by Nick Black
parent 68c0ac4093
commit ba8dd1b705

@ -41,6 +41,10 @@ typedef struct ncvisual_details {
/*static void /*static void
print_frame_summary(const AVCodecContext* cctx, const AVFrame* f){ print_frame_summary(const AVCodecContext* cctx, const AVFrame* f){
if(f == NULL){
fprintf(stderr, "NULL frame\n");
return;
}
char pfmt[128]; char pfmt[128];
av_get_pix_fmt_string(pfmt, sizeof(pfmt), f->format); av_get_pix_fmt_string(pfmt, sizeof(pfmt), f->format);
fprintf(stderr, "Frame %05d %p (%d? %d?) %dx%d pfmt %d (%s)\n", fprintf(stderr, "Frame %05d %p (%d? %d?) %dx%d pfmt %d (%s)\n",
@ -516,60 +520,68 @@ int ffmpeg_decode_loop(ncvisual* ncv){
return r; return r;
} }
// rows/cols: scaled output geometry (pixels) uint32_t* ffmpeg_resize_internal(const ncvisual* ncv, int rows, int* stride,
int ffmpeg_blit(ncvisual* ncv, int rows, int cols, ncplane* n, int cols, const blitterargs* bargs){
const struct blitset* bset, const blitterargs* bargs){
const AVFrame* inframe = ncv->details->frame; const AVFrame* inframe = ncv->details->frame;
//print_frame_summary(NULL, inframe); //print_frame_summary(NULL, inframe);
void* data = NULL;
int stride = 0;
const int targformat = AV_PIX_FMT_RGBA; const int targformat = AV_PIX_FMT_RGBA;
// necessitated by ffmpeg AVPicture API //fprintf(stderr, "got format: %d (%d/%d) want format: %d (%d/%d)\n", inframe->format, inframe->height, inframe->width, targformat, rows, cols);
uint8_t* dptrs[4] = {}; // FIXME need account for beg{y,x} here, no?
//fprintf(stderr, "got format: %d (%d/%d) want format: %d\n", inframe->format, inframe->height, inframe->width, targformat); if(cols == inframe->width && rows == inframe->height && inframe->format == targformat){
if(inframe && (cols != inframe->width || rows != inframe->height || inframe->format != targformat)){ // no change necessary. return original data -- we don't duplicate.
//fprintf(stderr, "resize+render: %d/%d->%d/%d\n", inframe->height, inframe->width, rows, cols); *stride = ncv->rowstride;
//fprintf(stderr, "WHN NCV: %d/%d bargslen: %d/%d\n", inframe->width, inframe->height, bargs->leny, bargs->lenx); return ncv->data;
const int srclenx = bargs->lenx ? bargs->lenx : inframe->width; }
const int srcleny = bargs->leny ? bargs->leny : inframe->height; const int srclenx = bargs->lenx ? bargs->lenx : inframe->width;
const int srcleny = bargs->leny ? bargs->leny : inframe->height;
//fprintf(stderr, "src %d/%d -> targ %d/%d ctx: %p\n", srcleny, srclenx, rows, cols, ncv->details->swsctx); //fprintf(stderr, "src %d/%d -> targ %d/%d ctx: %p\n", srcleny, srclenx, rows, cols, ncv->details->swsctx);
ncv->details->swsctx = sws_getCachedContext(ncv->details->swsctx, ncv->details->swsctx = sws_getCachedContext(ncv->details->swsctx,
srclenx, srcleny, srclenx, srcleny,
inframe->format, inframe->format,
cols, rows, targformat, cols, rows, targformat,
SWS_LANCZOS, NULL, NULL, NULL); SWS_LANCZOS, NULL, NULL, NULL);
if(ncv->details->swsctx == NULL){ if(ncv->details->swsctx == NULL){
//fprintf(stderr, "Error retrieving details->swsctx\n"); //fprintf(stderr, "Error retrieving details->swsctx\n");
return -1; return NULL;
} }
int dlinesizes[4]; // necessitated by ffmpeg AVPicture API
int size = av_image_alloc(dptrs, dlinesizes, cols, rows, targformat, IMGALLOCALIGN); uint8_t* dptrs[4] = {}; // FIXME kill initializer?
if(size < 0){ int dlinesizes[4];
int size = av_image_alloc(dptrs, dlinesizes, cols, rows, targformat, IMGALLOCALIGN);
if(size < 0){
//fprintf(stderr, "Error allocating visual data (%d X %d)\n", sframe->height, sframe->width); //fprintf(stderr, "Error allocating visual data (%d X %d)\n", sframe->height, sframe->width);
return -1; return NULL;
} }
//fprintf(stderr, "INFRAME DAA: %p SDATA: %p FDATA: %p to %d/%d\n", inframe->data[0], sframe->data[0], ncv->details->frame->data[0], sframe->height, sframe->width); //fprintf(stderr, "INFRAME DAA: %p SDATA: %p FDATA: %p to %d/%d\n", inframe->data[0], sframe->data[0], ncv->details->frame->data[0], sframe->height, sframe->width);
int height = sws_scale(ncv->details->swsctx, (const uint8_t* const*)inframe->data, int height = sws_scale(ncv->details->swsctx, (const uint8_t* const*)inframe->data,
inframe->linesize, 0, srcleny, dptrs, dlinesizes); inframe->linesize, 0, srcleny, dptrs, dlinesizes);
if(height < 0){ if(height < 0){
//fprintf(stderr, "Error applying scaling (%d X %d)\n", inframe->height, inframe->width); //fprintf(stderr, "Error applying scaling (%d X %d)\n", inframe->height, inframe->width);
return -1; av_freep(&dptrs[0]);
} return NULL;
stride = dlinesizes[0]; // FIXME check for others? }
data = dptrs[0];
//fprintf(stderr, "scaled %d/%d to %d/%d\n", ncv->pixy, ncv->pixx, rows, cols); //fprintf(stderr, "scaled %d/%d to %d/%d\n", ncv->pixy, ncv->pixx, rows, cols);
}else{ *stride = dlinesizes[0]; // FIXME check for others?
stride = ncv->rowstride; return (uint32_t*)dptrs[0];
data = ncv->data; }
// rows/cols: scaled output geometry (pixels)
int ffmpeg_blit(ncvisual* ncv, int rows, int cols, ncplane* n,
const struct blitset* bset, const blitterargs* bargs){
void* data;
int stride = 0;
data = ffmpeg_resize_internal(ncv, rows, &stride, cols, bargs);
if(data == NULL){
return -1;
} }
//fprintf(stderr, "rows/cols: %d/%d\n", rows, cols); //fprintf(stderr, "WHN NCV: %d/%d bargslen: %d/%d targ: %d/%d\n", inframe->width, inframe->height, bargs->leny, bargs->lenx, rows, cols);
int ret = 0; int ret = 0;
if(rgba_blit_dispatch(n, bset, stride, data, rows, cols, bargs) < 0){ if(rgba_blit_dispatch(n, bset, stride, data, rows, cols, bargs) < 0){
//fprintf(stderr, "rgba dispatch failed!\n"); //fprintf(stderr, "rgba dispatch failed!\n");
ret = -1; ret = -1;
} }
if(dptrs[0]){ if(data != ncv->data){
av_freep(&dptrs[0]); av_freep(&data); // &dptrs[0]
} }
return ret; return ret;
} }

Loading…
Cancel
Save