diff --git a/src/media/ffmpeg.c b/src/media/ffmpeg.c index 351ebf6e6..0a4449c19 100644 --- a/src/media/ffmpeg.c +++ b/src/media/ffmpeg.c @@ -523,16 +523,12 @@ int ffmpeg_blit(ncvisual* ncv, int rows, int cols, ncplane* n, //print_frame_summary(NULL, inframe); void* data = NULL; int stride = 0; - AVFrame* sframe = NULL; const int targformat = AV_PIX_FMT_RGBA; + // necessitated by ffmpeg AVPicture API + uint8_t* dptrs[4] = {}; //fprintf(stderr, "got format: %d (%d/%d) want format: %d\n", inframe->format, inframe->height, inframe->width, targformat); if(inframe && (cols != inframe->width || rows != inframe->height || inframe->format != targformat)){ //fprintf(stderr, "resize+render: %d/%d->%d/%d\n", inframe->height, inframe->width, rows, cols); - sframe = av_frame_alloc(); - if(sframe == NULL){ -//fprintf(stderr, "Couldn't allocate output frame for scaled frame\n"); - return -1; - } //fprintf(stderr, "WHN NCV: %d/%d bargslen: %d/%d\n", inframe->width, inframe->height, bargs->leny, bargs->lenx); const int srclenx = bargs->lenx ? bargs->lenx : inframe->width; const int srcleny = bargs->leny ? bargs->leny : inframe->height; @@ -546,47 +542,36 @@ int ffmpeg_blit(ncvisual* ncv, int rows, int cols, ncplane* n, //fprintf(stderr, "Error retrieving details->swsctx\n"); return -1; } - memcpy(sframe, inframe, sizeof(*inframe)); - sframe->format = targformat; - sframe->width = cols; - sframe->height = rows; - int size = av_image_alloc(sframe->data, sframe->linesize, - sframe->width, sframe->height, - sframe->format, - IMGALLOCALIGN); + 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); return -1; } //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, - inframe->linesize, 0, srcleny, sframe->data, - sframe->linesize); + inframe->linesize, 0, srcleny, dptrs, dlinesizes); if(height < 0){ //fprintf(stderr, "Error applying scaling (%d X %d)\n", inframe->height, inframe->width); return -1; } - stride = sframe->linesize[0]; // FIXME check for others? - data = sframe->data[0]; -//fprintf(stderr, "scaled %d/%d to %d/%d (%d/%d)\n", ncv->pixy, ncv->pixx, rows, cols, sframe->height, sframe->width); + 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); }else{ stride = ncv->rowstride; data = ncv->data; } //fprintf(stderr, "rows/cols: %d/%d\n", rows, cols); + int ret = 0; if(rgba_blit_dispatch(n, bset, stride, data, rows, cols, bargs) < 0){ //fprintf(stderr, "rgba dispatch failed!\n"); - if(sframe){ - av_freep(&sframe->data[0]); - av_freep(&sframe); - } - return -1; + ret = -1; } - if(sframe){ - av_freep(&sframe->data[0]); - av_freep(&sframe); + if(dptrs[0]){ + av_freep(&dptrs[0]); } - return 0; + return ret; } void ffmpeg_details_seed(ncvisual* ncv){