|
|
|
@ -894,81 +894,81 @@ static void video_image_display(VideoState *is) |
|
|
|
|
SDL_Rect rect; |
|
|
|
|
|
|
|
|
|
vp = frame_queue_peek_last(&is->pictq); |
|
|
|
|
if (is->subtitle_st) { |
|
|
|
|
if (frame_queue_nb_remaining(&is->subpq) > 0) { |
|
|
|
|
sp = frame_queue_peek(&is->subpq); |
|
|
|
|
|
|
|
|
|
if (vp->pts >= sp->pts + ((float) sp->sub.start_display_time / 1000)) { |
|
|
|
|
if (!sp->uploaded) { |
|
|
|
|
uint8_t* pixels[4]; |
|
|
|
|
int pitch[4]; |
|
|
|
|
int i; |
|
|
|
|
if (!sp->width || !sp->height) { |
|
|
|
|
sp->width = vp->width; |
|
|
|
|
sp->height = vp->height; |
|
|
|
|
} |
|
|
|
|
if (realloc_texture(&is->sub_texture, SDL_PIXELFORMAT_ARGB8888, sp->width, sp->height, SDL_BLENDMODE_BLEND, 1) < 0) |
|
|
|
|
if (is->subtitle_st) { |
|
|
|
|
if (frame_queue_nb_remaining(&is->subpq) > 0) { |
|
|
|
|
sp = frame_queue_peek(&is->subpq); |
|
|
|
|
|
|
|
|
|
if (vp->pts >= sp->pts + ((float) sp->sub.start_display_time / 1000)) { |
|
|
|
|
if (!sp->uploaded) { |
|
|
|
|
uint8_t* pixels[4]; |
|
|
|
|
int pitch[4]; |
|
|
|
|
int i; |
|
|
|
|
if (!sp->width || !sp->height) { |
|
|
|
|
sp->width = vp->width; |
|
|
|
|
sp->height = vp->height; |
|
|
|
|
} |
|
|
|
|
if (realloc_texture(&is->sub_texture, SDL_PIXELFORMAT_ARGB8888, sp->width, sp->height, SDL_BLENDMODE_BLEND, 1) < 0) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
for (i = 0; i < sp->sub.num_rects; i++) { |
|
|
|
|
AVSubtitleRect *sub_rect = sp->sub.rects[i]; |
|
|
|
|
|
|
|
|
|
sub_rect->x = av_clip(sub_rect->x, 0, sp->width ); |
|
|
|
|
sub_rect->y = av_clip(sub_rect->y, 0, sp->height); |
|
|
|
|
sub_rect->w = av_clip(sub_rect->w, 0, sp->width - sub_rect->x); |
|
|
|
|
sub_rect->h = av_clip(sub_rect->h, 0, sp->height - sub_rect->y); |
|
|
|
|
|
|
|
|
|
is->sub_convert_ctx = sws_getCachedContext(is->sub_convert_ctx, |
|
|
|
|
sub_rect->w, sub_rect->h, AV_PIX_FMT_PAL8, |
|
|
|
|
sub_rect->w, sub_rect->h, AV_PIX_FMT_BGRA, |
|
|
|
|
0, NULL, NULL, NULL); |
|
|
|
|
if (!is->sub_convert_ctx) { |
|
|
|
|
av_log(NULL, AV_LOG_FATAL, "Cannot initialize the conversion context\n"); |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
for (i = 0; i < sp->sub.num_rects; i++) { |
|
|
|
|
AVSubtitleRect *sub_rect = sp->sub.rects[i]; |
|
|
|
|
|
|
|
|
|
sub_rect->x = av_clip(sub_rect->x, 0, sp->width ); |
|
|
|
|
sub_rect->y = av_clip(sub_rect->y, 0, sp->height); |
|
|
|
|
sub_rect->w = av_clip(sub_rect->w, 0, sp->width - sub_rect->x); |
|
|
|
|
sub_rect->h = av_clip(sub_rect->h, 0, sp->height - sub_rect->y); |
|
|
|
|
|
|
|
|
|
is->sub_convert_ctx = sws_getCachedContext(is->sub_convert_ctx, |
|
|
|
|
sub_rect->w, sub_rect->h, AV_PIX_FMT_PAL8, |
|
|
|
|
sub_rect->w, sub_rect->h, AV_PIX_FMT_BGRA, |
|
|
|
|
0, NULL, NULL, NULL); |
|
|
|
|
if (!is->sub_convert_ctx) { |
|
|
|
|
av_log(NULL, AV_LOG_FATAL, "Cannot initialize the conversion context\n"); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
if (!SDL_LockTexture(is->sub_texture, (SDL_Rect *)sub_rect, (void **)pixels, pitch)) { |
|
|
|
|
sws_scale(is->sub_convert_ctx, (const uint8_t * const *)sub_rect->data, sub_rect->linesize, |
|
|
|
|
0, sub_rect->h, pixels, pitch); |
|
|
|
|
SDL_UnlockTexture(is->sub_texture); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
sp->uploaded = 1; |
|
|
|
|
if (!SDL_LockTexture(is->sub_texture, (SDL_Rect *)sub_rect, (void **)pixels, pitch)) { |
|
|
|
|
sws_scale(is->sub_convert_ctx, (const uint8_t * const *)sub_rect->data, sub_rect->linesize, |
|
|
|
|
0, sub_rect->h, pixels, pitch); |
|
|
|
|
SDL_UnlockTexture(is->sub_texture); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} else |
|
|
|
|
sp = NULL; |
|
|
|
|
} |
|
|
|
|
sp->uploaded = 1; |
|
|
|
|
} |
|
|
|
|
} else |
|
|
|
|
sp = NULL; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
calculate_display_rect(&rect, is->xleft, is->ytop, is->width, is->height, vp->width, vp->height, vp->sar); |
|
|
|
|
calculate_display_rect(&rect, is->xleft, is->ytop, is->width, is->height, vp->width, vp->height, vp->sar); |
|
|
|
|
|
|
|
|
|
if (!vp->uploaded) { |
|
|
|
|
int sdl_pix_fmt = vp->frame->format == AV_PIX_FMT_YUV420P ? SDL_PIXELFORMAT_YV12 : SDL_PIXELFORMAT_ARGB8888; |
|
|
|
|
if (realloc_texture(&is->vid_texture, sdl_pix_fmt, vp->frame->width, vp->frame->height, SDL_BLENDMODE_NONE, 0) < 0) |
|
|
|
|
return; |
|
|
|
|
if (upload_texture(is->vid_texture, vp->frame, &is->img_convert_ctx) < 0) |
|
|
|
|
return; |
|
|
|
|
vp->uploaded = 1; |
|
|
|
|
vp->flip_v = vp->frame->linesize[0] < 0; |
|
|
|
|
} |
|
|
|
|
if (!vp->uploaded) { |
|
|
|
|
int sdl_pix_fmt = vp->frame->format == AV_PIX_FMT_YUV420P ? SDL_PIXELFORMAT_YV12 : SDL_PIXELFORMAT_ARGB8888; |
|
|
|
|
if (realloc_texture(&is->vid_texture, sdl_pix_fmt, vp->frame->width, vp->frame->height, SDL_BLENDMODE_NONE, 0) < 0) |
|
|
|
|
return; |
|
|
|
|
if (upload_texture(is->vid_texture, vp->frame, &is->img_convert_ctx) < 0) |
|
|
|
|
return; |
|
|
|
|
vp->uploaded = 1; |
|
|
|
|
vp->flip_v = vp->frame->linesize[0] < 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
SDL_RenderCopyEx(renderer, is->vid_texture, NULL, &rect, 0, NULL, vp->flip_v ? SDL_FLIP_VERTICAL : 0); |
|
|
|
|
if (sp) { |
|
|
|
|
SDL_RenderCopyEx(renderer, is->vid_texture, NULL, &rect, 0, NULL, vp->flip_v ? SDL_FLIP_VERTICAL : 0); |
|
|
|
|
if (sp) { |
|
|
|
|
#if USE_ONEPASS_SUBTITLE_RENDER |
|
|
|
|
SDL_RenderCopy(renderer, is->sub_texture, NULL, &rect); |
|
|
|
|
SDL_RenderCopy(renderer, is->sub_texture, NULL, &rect); |
|
|
|
|
#else |
|
|
|
|
int i; |
|
|
|
|
double xratio = (double)rect.w / (double)sp->width; |
|
|
|
|
double yratio = (double)rect.h / (double)sp->height; |
|
|
|
|
for (i = 0; i < sp->sub.num_rects; i++) { |
|
|
|
|
SDL_Rect *sub_rect = (SDL_Rect*)sp->sub.rects[i]; |
|
|
|
|
SDL_Rect target = {.x = rect.x + sub_rect->x * xratio, |
|
|
|
|
.y = rect.y + sub_rect->y * yratio, |
|
|
|
|
.w = sub_rect->w * xratio, |
|
|
|
|
.h = sub_rect->h * yratio}; |
|
|
|
|
SDL_RenderCopy(renderer, is->sub_texture, sub_rect, &target); |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
int i; |
|
|
|
|
double xratio = (double)rect.w / (double)sp->width; |
|
|
|
|
double yratio = (double)rect.h / (double)sp->height; |
|
|
|
|
for (i = 0; i < sp->sub.num_rects; i++) { |
|
|
|
|
SDL_Rect *sub_rect = (SDL_Rect*)sp->sub.rects[i]; |
|
|
|
|
SDL_Rect target = {.x = rect.x + sub_rect->x * xratio, |
|
|
|
|
.y = rect.y + sub_rect->y * yratio, |
|
|
|
|
.w = sub_rect->w * xratio, |
|
|
|
|
.h = sub_rect->h * yratio}; |
|
|
|
|
SDL_RenderCopy(renderer, is->sub_texture, sub_rect, &target); |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static inline int compute_mod(int a, int b) |
|
|
|
|