硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2244|回复: 17
收起左侧

[emWin] 请教下,使用stm32f7x硬件解码avi视频+emwin并显示出现闪烁?

  [复制链接]

681

主题

3485

回帖

5553

积分

论坛元老

积分
5553
发表于 2018-8-20 09:46:09 | 显示全部楼层 |阅读模式

请教下,使用stm32f7x硬件解码avi视频+emwin并显示出现闪烁?
都是使用 dma2d 输出

视频效果地址:
https://v.youku.com/v_show/id_XM ... j.8428770.3416059.1
视频中,SCB_CleanInvalidateDCache();      这个函数是没有屏蔽的

// **********************************************************************************************************************************************
在解码期间,如果屏蔽如下函数里面的 SCB_CleanInvalidateDCache 这个函数,显示画面比较稳定,不会出现闪烁,抖动的情况,但是显示的画面是黑丝或者有黑点条状:

static void AVI_HardDecodeFrame(uint16_t  _usX,
                                                                                                                                uint16_t  _usY,
                                                                                                                                unsigned int buf,
                                                                                                                                unsigned int size,
                                                                                                                                uint32_t AviOutAddrBuff)
{
  uint8_t  _JpegProcessing_End;
       
  AVI_JPEG_Decode_DMA(&JPEG_Handle, (uint32_t)buf, size , AviOutAddrBuff);  

  _JpegProcessing_End = 0;
  do
  {
//   SCB_CleanInvalidateDCache();                              //貌似跟这个有关,吧这个函数屏蔽后显示就不会闪烁了,但是貌似没有视频图像出来,画面如下所以  ?????????
    _JpegProcessing_End = JPEG_OutputHandler(&JPEG_Handle);

  }while(_JpegProcessing_End == 0);  


    HAL_JPEG_GetInfo(&JPEG_Handle, &JPEG_Info);
        AVI_DMA2D_Init(JPEG_Info.ImageWidth, JPEG_Info.ImageHeight);  
        AVI_DMA2D_CopyBuffer((uint32_t *)AviOutAddrBuff,
                                                                                                (uint32_t *)JPEG_LCD_FRAME_BUFFER,
                                                                                                _usX ,
                                                                                                _usY,
                                                                                                JPEG_Info.ImageWidth,
                                                                                                JPEG_Info.ImageHeight);
}

// **********************************************************************************************************************************************
屏蔽 SCB_CleanInvalidateDCache();      这个函数后显示的效果画面如下:

1.png


2.png


3.png


4.png


// ************************************************************************************************************************

如果不使用 emwin 这个是没有问题的


// dma2d 显示函数
static void AVI_DMA2D_CopyBuffer(uint32_t *pSrc, uint32_t *pDst, uint16_t _usX, uint16_t _usY, uint16_t ImageWidth, uint16_t ImageHeight)
{
        __IO uint32_t  XaddrPutPixel = 0, timeout=0;

    XaddrPutPixel = (BYTES_PER_PIXEL * (uint32_t)((_usY * LCD_PIXEL_WIDTH) + (_usX)));

                        {
                        // 查询法
                                DMA2D->CR     &= ~DMA2D_CR_START;   // 现停止 dma2d
                       
                                DMA2D->NLR &= ~(DMA2D_NLR_NL | DMA2D_NLR_PL);
                                DMA2D->NLR |= (ImageHeight | (ImageWidth << 16));
                 
                                DMA2D->OMAR    = (uint32_t)pDst + XaddrPutPixel;
                                DMA2D->FGMAR   = (uint32_t)pSrc ;
                               
                                DMA2D->CR     |= DMA2D_CR_START;   // 启动

                                while((DMA2D->ISR & (DMA2D_FLAG_TC)) == 0)          //等待传输完成
                                {
                                        timeout++;
                                        if(timeout > 0X1FFFFF) break;              //超时退出
                                }
                                        DMA2D->IFCR |= (DMA2D_FLAG_TC | DMA2D_FLAG_CTC);                                          //清除传输完成标志
                        }
               
}









回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-8-20 11:36:58 | 显示全部楼层
不使用DMA2D正常吗,直接手动更新缓冲。另外关闭下你使用的存储器的Cache,使用MPU设置下看看。
回复

使用道具 举报

681

主题

3485

回帖

5553

积分

论坛元老

积分
5553
 楼主| 发表于 2018-8-20 16:12:50 | 显示全部楼层
eric2013 发表于 2018-8-20 11:36
不使用DMA2D正常吗,直接手动更新缓冲。另外关闭下你使用的存储器的Cache,使用MPU设置下看看。

不使用 dma2d 也不行,也就是使用 打点的方式显示,也会有闪烁,

关闭cache 还没有测试,等会测试后再回复你结果
回复

使用道具 举报

681

主题

3485

回帖

5553

积分

论坛元老

积分
5553
 楼主| 发表于 2018-8-20 19:38:44 | 显示全部楼层
eric2013 发表于 2018-8-20 11:36
不使用DMA2D正常吗,直接手动更新缓冲。另外关闭下你使用的存储器的Cache,使用MPU设置下看看。

你好,我把 cache 关闭也还是一样的结果

说明跟这个cache 基本没有什么关系啊,估计关系最大的可能就是使用  emwin 与普通的显示方式不融洽 ???
回复

使用道具 举报

681

主题

3485

回帖

5553

积分

论坛元老

积分
5553
 楼主| 发表于 2018-8-20 23:50:59 | 显示全部楼层
eric2013 发表于 2018-8-20 11:36
不使用DMA2D正常吗,直接手动更新缓冲。另外关闭下你使用的存储器的Cache,使用MPU设置下看看。

你好,播放视频自然播放完成后自动切换到下一首视频时,貌似在 播放视频任务里面始终都会收到  MusicTaskAudioGetTime_7 这个消息,

MusicTaskAudioPlay_5 / MusicTaskAudioStart_8  这两个始终都收不到,但是在切换时是已经发送了的,请问这是为何 啊 ?

在正常播放还没有结束时 按 下一曲、上一曲 切换都正常,音乐播放一切也都正常

#define MusicTaskWaitFlag               (MusicTaskAudioFillBuffer0_10 | MusicTaskAudioFillBuffer1_9 | MusicTaskAudioReturn_6 | MusicTaskAudioGetTime_7)
#define MusicTaskWaitBuffer              (MusicTaskAudioFillBuffer0_10 | MusicTaskAudioFillBuffer1_9)

视频播放我是共用如下任务
static  void vTaskMusic(void *pvParameters)
{
    MusicMsg_T *pMsg;
    BaseType_t xResult;

    ( void )pvParameters;          /* 避免编译器告警 */
    while(1)
    {
        /* 接受数据,播放MP3文件或者WAV文件 */
        xResult = xQueueReceive(xQueue,                    /* 消息队列句柄 */
                                                        (void *)&pMsg,             /* 这里获取的是结构体的地址 */
                                                        (TickType_t)portMAX_DELAY);/* 设置阻塞时间 */

        if( xResult == pdPASS )
        {
            /* DMA禁止后要等到当前转换完毕才可以停止,所以这里需要清除相应标志 */
            xEventGroupWaitBits(xCreatedEventGroup, /* 事件标志组句柄 */
                                                    MusicTaskWaitFlag,  /* 等待MusicTaskWaitFlag某位被设置 */
                                                    pdTRUE,             /* 退出前MusicTaskWaitFlag被清除,这里是任意MusicTaskWaitFlag位被设置就“退出”*/
                                                    pdFALSE,            /* 设置为pdFALSE表示等待MusicTaskWaitFlag任意位被设置*/
                                                    0);                  /* 等待延迟时间 */

      switch(pMsg->ucType)
      {
        case MusicType_WAV:
        {
           WavMusicPlay((const char *)pMsg->ucName);                    
        } break;
        
        case  MusicType_MP3:
        {
           MP3MusicPlay((const char *)pMsg->ucName);        
        } break;
        
        case  MusicType_FLAC:
        {
           FLACMusicPlay((const char *)pMsg->ucName);
        } break;
        
        case  MusicType_APE:
        {
          APEMusicPlay((const char *)pMsg->ucName);
        } break;
               
        case  MusicType_REC:
        {
                    /* 录音机 */
                    WavRecPlay((const char *)pMsg->ucName);
        }     break;               

               
        case  MusicType_RADIO:
        {
                    /* 收音机 */
                    RadioPlay();
        }     break;                    
                        
        case  MusicType_AVI:
        {
                    /* avi 视频播放 */
                    AVIMusicPlay((const char *)pMsg->ucName);
        }     break;   

        case  MusicType_EMF:
        {

        }     break;                    

        
        default : break;
      }
        }
    }
}

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-8-21 09:43:25 | 显示全部楼层
hpdell 发表于 2018-8-20 23:50
你好,播放视频自然播放完成后自动切换到下一首视频时,貌似在 播放视频任务里面始终都会收到  MusicTask ...

视频播放器不加声音,正常了吗
回复

使用道具 举报

681

主题

3485

回帖

5553

积分

论坛元老

积分
5553
 楼主| 发表于 2018-8-22 15:14:22 | 显示全部楼层
eric2013 发表于 2018-8-21 09:43
视频播放器不加声音,正常了吗

不加声音,效果也还是一样的,

刚刚看到这个 LCD_DrawBitmap 函数, 准备使用这个函数来搞,不知道是否可行   ??
回复

使用道具 举报

681

主题

3485

回帖

5553

积分

论坛元老

积分
5553
 楼主| 发表于 2018-8-26 17:56:35 | 显示全部楼层
本帖最后由 hpdell 于 2018-8-28 10:50 编辑

终于基本搞定了,修改如下:
1. 吧 DMA2D_HandleAVI.Init.Mode          = DMA2D_R2M;
2. 使用 emwin 提供的函数显示函数 , LCD_DrawBitmap
3. 经过上面的几步修改后,目前播放 avi 视频 还是比较流畅的,480*320的avi视频,其他格式没有测试4.mdk优化等级设置为缺省值即可




回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-8-28 01:17:25 | 显示全部楼层
hpdell 发表于 2018-8-26 17:56
终于基本搞定了,修改如下:
1. 吧 DMA2D_HandleAVI.Init.Mode          = DMA2D_R2M;
2. 使 ...


你以前是用的那个函数绘制的
回复

使用道具 举报

681

主题

3485

回帖

5553

积分

论坛元老

积分
5553
 楼主| 发表于 2018-8-28 10:49:51 | 显示全部楼层
eric2013 发表于 2018-8-28 01:17
你以前是用的那个函数绘制的

我以前是使用自己的 dma2d 绘制的,dma2d模式设置为 DMA2D_M2M, 貌似这个貌似在解码时速度比较慢(使用emwin功能),

在不使用 emwin 时,dma2d 模式设置为 DMA2D_M2M 这个貌似是可以的,具体原因目前我也还没有搞清楚

使用emwin 后,dma2d 貌似貌似设置为 R2M 再使用 emwin 提供的 那个函数,速度还是不错的
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-8-29 00:56:53 | 显示全部楼层
hpdell 发表于 2018-8-28 10:49
我以前是使用自己的 dma2d 绘制的,dma2d模式设置为 DMA2D_M2M, 貌似这个貌似在解码时速度比较慢(使用emw ...

非常感谢提供的经验
回复

使用道具 举报

681

主题

3485

回帖

5553

积分

论坛元老

积分
5553
 楼主| 发表于 2018-8-31 09:11:13 | 显示全部楼层
本帖最后由 hpdell 于 2018-8-31 10:21 编辑
eric2013 发表于 2018-8-29 00:56
非常感谢提供的经验

你好,现在貌似又出现新的问题了啊,

现在貌似就是 有一个控件图标不能够进入,仿真时发现 进入到另外的控件窗口进行创建窗口时, id 值为  0x17,就唯独这个控件窗口不行,其他还是没有问题的
0x17 对应的id 说明 #define WM_GET_CLIENT_WINDOW        23      /* Get window handle of client window. Default is the same as window */
在创建这个控件窗口时,我没有使用客户端窗口
会出现硬件中断错误

如果优化等级设置为 0 就不会出现这样的情况,这是为何啊 ?

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-9-1 01:26:19 | 显示全部楼层
hpdell 发表于 2018-8-31 09:11
你好,现在貌似又出现新的问题了啊,

现在貌似就是 有一个控件图标不能够进入,仿真时发现 进入到另外 ...

可以使用MDK安装目录的emWin库文件试试。MDK安装目录仅提供了ABGR格式的库文件,这个不用管,主要是看看会不会出硬件异常。
回复

使用道具 举报

681

主题

3485

回帖

5553

积分

论坛元老

积分
5553
 楼主| 发表于 2018-9-1 12:00:35 | 显示全部楼层
eric2013 发表于 2018-9-1 01:26
可以使用MDK安装目录的emWin库文件试试。MDK安装目录仅提供了ABGR格式的库文件,这个不用管,主要是看看 ...

mdk安装目录提供的库也试过了,结果都是一样的
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-9-1 15:29:29 | 显示全部楼层
hpdell 发表于 2018-9-1 12:00
mdk安装目录提供的库也试过了,结果都是一样的

这样的话,那就是程序问题了,你新建的这个窗口是以对话框的形式创建的还是以其它方式,可以给这个对话框仅显示1个返回按钮,这样看看是否还有问题。
现在只能排查问题了。
回复

使用道具 举报

681

主题

3485

回帖

5553

积分

论坛元老

积分
5553
 楼主| 发表于 2018-9-2 07:27:18 | 显示全部楼层
本帖最后由 hpdell 于 2018-9-2 07:29 编辑
eric2013 发表于 2018-9-1 15:29
这样的话,那就是程序问题了,你新建的这个窗口是以对话框的形式创建的还是以其它方式,可以给这个对话框 ...

都是按照其他图标的套路创建的,但就唯独这个图标创建一个按钮也不行,

所以就感觉很纳闷啊
如果万一不行,就只能使用 0级优化,降低 lcd 时钟频率的方法了, 这个方法各个图标按钮的功能都完全正常,只是貌似屏幕有轻微的闪烁感,估计应该是屏幕的频率刷新率不够吧 ?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-9-3 00:14:47 | 显示全部楼层
hpdell 发表于 2018-9-2 07:27
都是按照其他图标的套路创建的,但就唯独这个图标创建一个按钮也不行,

所以就感觉很纳闷啊

是的,优化等级高了,效果要好些。特别是程序比较复杂的时候。
回复

使用道具 举报

681

主题

3485

回帖

5553

积分

论坛元老

积分
5553
 楼主| 发表于 2018-9-3 09:55:54 | 显示全部楼层
本帖最后由 hpdell 于 2018-9-3 09:57 编辑
eric2013 发表于 2018-9-3 00:14
是的,优化等级高了,效果要好些。特别是程序比较复杂的时候。

现在最终确定还是使用 0及优化 + 降低 LCD 时钟频率解决了,

至于屏幕有轻微的闪烁感,现在目前还没有找到解决方法,但是这个轻微的闪烁感,使用手机拍照是看不到的,

也不知道是不是因为 lcd 的时钟频率低了,导致刷新率不够造成的哇 ?

如果吧 lcd 的时钟频率提高的话,这个闪烁感是绝对没有的

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-17 06:44 , Processed in 0.305296 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表