【写在前面】近期参与到OEM项目中,目前主要是DLNA的项目维护与新feature实现。本系列博文主要记录所修过的issues以及对DLNA stack的理解和分析,以便后来查阅。
------------------------------------------------------------------------------------------------------------------------------------
向Sharp BD upload m2ts文件时,如果屏幕锁屏后导致WiFi断开或者手动关掉WiFi,都会导致libdmc库crash,必现。分析原因是:在向Sharp BD upload格式为m2ts的媒体时,stack会轮询向BD发送媒体数据和接收response。当WiFi链接断开时,stack接收不到response,此时正确的处理是:抛出Error的错误并停止再向BD发送数据。但是之前stack中的处理是抛出Error并继续发送了数据,由此造成了空指针异常并引起crash。
该bug强调一定是向sharp设备upload m2ts媒体,因为这一case走的流程是CUploaderM2ts文件中的upload,该流程是stack为sharp定制的。
=============================================================================
upload模块分析:
Upnpstack_Export.cpp -----> TVUPNP_EnableUploader
Upnpstack_Export.cpp -----> TVUPNP_UploadFile
CUploadManager ------> GetUploader 获取CUploaderBase子类的uploader对象
uploader对象调用各自的UploadFile方法
UploadFile方法中先通过DeviceCapabilityCheck检查DMS允许上传的文件类型,再通过ObjectCapabilityCheck方法判断szParentId是否是“DLNA.ORG_AnyContainer”,当前stack仅支持上传到DLNA.ORG_AnyContainer.
判断完成后,通过SetState设置upload状态m_State为正在处理。
随后启动timer,并且将自己(子类的upload都是继承了Task的)加入到TaskManager中(via AddToManager method)。
进入子类的DoRun方法(如果已重写)进行轮询,根据状态判断流程走向。