ffplay源码分析5-图像格式转换

 作者:leisure

本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10311376.html


ffplay是FFmpeg工程自带的简单播放器,使用FFmpeg提供的解码器和SDL库进行视频播放。本文基于FFmpeg工程4.1版本进行分析,其中ffplay源码清单如下:
https://github.com/FFmpeg/FFmpeg/blob/n4.1/fftools/ffplay.c

在尝试分析源码前,可先阅读如下参考文章作为铺垫:
[1]. 雷霄骅,视音频编解码技术零基础学习方法
[2]. 视频编解码基础概念
[3]. 色彩空间与像素格式
[4]. 音频参数解析
[5]. FFmpeg基础概念

“ffplay源码分析”系列文章如下:
[1]. ffplay源码分析1-概述
[2]. ffplay源码分析2-数据结构
[3]. ffplay源码分析3-代码框架
[4]. ffplay源码分析4-音视频同步
[5]. ffplay源码分析5-图像格式转换
[6]. ffplay源码分析6-音频重采样
[7]. ffplay源码分析7-播放控制

5. 图像格式转换

FFmpeg解码得到的视频帧的格式未必能被SDL支持,在这种情况下,需要进行图像格式转换,即将视频帧图像格式转换为SDL支持的图像格式,否则是无法正常显示的。
图像格式转换是在视频播放线程(主线程中)中的upload_texture()函数中实现的。调用链如下:

1 2 3 4 5 6 7 main() -- > event_loop --> refresh_loop_wait_event() --> video_refresh() --> video_display() --> video_image_display() --> upload_texture()

upload_texture()
upload_texture()源码如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 static int upload_texture(SDL_Texture **tex, AVFrame *frame, struct SwsContext **img_convert_ctx) {     int ret = 0;     Uint32 sdl_pix_fmt;     SDL_BlendMode sdl_blendmode;     // 根据frame中的图像格式(FFmpeg像素格式),获取对应的SDL像素格式     get_sdl_pix_fmt_and_blendmode(frame->format, &sdl_pix_fmt, &sdl_blendmode);     // 参数tex实际是&is->vid_texture,此处根据得到的SDL像素格式,为&is->vid_texture     if (realloc_texture(tex, sdl_pix_fmt == SDL_PIXELFORMAT_UNKNOWN ? SDL_PIXELFORMAT_ARGB8888 : sdl_pix_fmt, frame->width, frame->height, sdl_blendmode, 0) < 0)         return -1;     switch (sdl_pix_fmt) {         // frame格式是SDL不支持的格式,则需要进行图像格式转换,转换为目标格式AV_PIX_FMT_BGRA,对应SDL_PIXELFORMAT_BGRA32         case SDL_PIXELFORMAT_UNKNOWN:             /* This should only happen if we are not using avfilter... */             *img_convert_ctx = sws_getCachedContext(*img_convert_ctx,                 frame->width, frame->height, frame->format, frame->width, frame->height,                 AV_PIX_FMT_BGRA, sws_flags, NULL, 
                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信