使用gpac封装mp4代码解析(三)

101 阅读1分钟

本文已参与 [新人创作礼] 活动,一起开启掘金创作之路。

《使用gpac封装mp4代码解析(二)》详细分析了WriteH264函数,本文分析调用WriteH264函数中调用的函数WriteH264Nalu。

函数WriteH264Nalu源码如下:

int AF_MP4Writer::WriteH264Nalu(unsigned char **ppNaluData, int *pNaluLength)
{	
	m_nTrackID = gf_isom_new_track(m_pFile, 0, GF_ISOM_MEDIA_VISUAL, 1000);
	gf_isom_set_track_enabled(m_pFile, m_nTrackID, 1);

	GF_AVCConfig *pstAVCConfig = gf_odf_avc_cfg_new();	
	gf_isom_avc_config_new(m_pFile, m_nTrackID, pstAVCConfig, NULL, NULL, &m_nStreamIndex);
	gf_isom_set_visual_info(m_pFile, m_nTrackID, m_nStreamIndex, m_nWidth, m_nHeight);
	
	pstAVCConfig->configurationVersion = 1;
	pstAVCConfig->AVCProfileIndication = ppNaluData[AF_NALU_SPS][1];
	pstAVCConfig->profile_compatibility = ppNaluData[AF_NALU_SPS][2];
	pstAVCConfig->AVCLevelIndication = ppNaluData[AF_NALU_SPS][3];

	GF_AVCConfigSlot stAVCConfig[AF_NALU_MAX];
	memset(stAVCConfig, 0, sizeof(stAVCConfig));

	for (int i = 0; i < AF_NALU_MAX; i++)
	{
		if (i == AF_NALU_VPS)
			continue;

		stAVCConfig[i].size = pNaluLength[i];
		stAVCConfig[i].data = (char *)ppNaluData[i];
		if (i == AF_NALU_SPS)
		{
			gf_list_add(pstAVCConfig->sequenceParameterSets, &stAVCConfig[i]);
		}
		else if (i == AF_NALU_PPS)
		{
			gf_list_add(pstAVCConfig->pictureParameterSets, &stAVCConfig[i]);
		}
	}
	gf_isom_avc_config_update(m_pFile, m_nTrackID, 1, pstAVCConfig);

	pstAVCConfig->pictureParameterSets = NULL;
	pstAVCConfig->sequenceParameterSets = NULL;
	gf_odf_avc_cfg_del(pstAVCConfig);
	pstAVCConfig = NULL;

	return 0;
}

这个函数就与gpac底层代码紧密连接了,调用的基本都是gpac库的接口函数。一个一个来看。

m_nTrackID = gf_isom_new_track(m_pFile, 0, GF_ISOM_MEDIA_VISUAL, 1000);

函数定义位于gpac/include/gpac/isomedia.h中:

/*creates a new Track. If trackID = 0, the trackID is chosen by the API
returns the track number or 0 if error*/
u32 gf_isom_new_track(GF_ISOFile *the_file, u32 trackID, u32 MediaType, u32 TimeScale);

gf_isom_set_track_enabled(m_pFile, m_nTrackID, 1);

函数定义位于gpac/include/gpac/isomedia.h中:

/*sets the enable flag of a track*/
GF_Err gf_isom_set_track_enabled(GF_ISOFile *the_file, u32 trackNumber, u8 enableTrack);

GF_AVCConfig *pstAVCConfig = gf_odf_avc_cfg_new();

函数定义位于gpac/include/gpac/mpeg4_odf.h中:

/*! AVC config constructor
 \return the created AVC config*/
GF_AVCConfig *gf_odf_avc_cfg_new();

gf_isom_avc_config_new(m_pFile, m_nTrackID, pstAVCConfig, NULL, NULL, &m_nStreamIndex);

函数定义位于gpac/include/gpac/isomedia.h中:

/*creates new AVC config*/
GF_Err gf_isom_avc_config_new(GF_ISOFile *the_file, u32 trackNumber, GF_AVCConfig *cfg, char *URLname, char *URNname, u32 *outDescriptionIndex);

gf_isom_set_visual_info(m_pFile, m_nTrackID, m_nStreamIndex, m_nWidth, m_nHeight);

函数定义位于gpac/include/gpac/isomedia.h中:

​​

/*since v2 you must specify w/h of video tracks for authoring tools (no decode the video cfg / first sample)*/
GF_Err gf_isom_set_visual_info(GF_ISOFile *the_file, u32 trackNumber, u32 StreamDescriptionIndex, u32 Width, u32 Height);