⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asfdemux_callback.c

📁 1. 8623L平台
💻 C
📖 第 1 页 / 共 5 页
字号:
			//context->addSeqHeader = TRUE;			break;		case 0x20525644: //MPEG2 video			RMDBGLOG((ENABLE, "MPEG2 video\n"));			break;		default:			fprintf(stderr,"FourCC: 0x%lx not supported !!!\n",context->Compression_ID);			return RM_VIDEO_CODEC_NOT_SUPPORTED;		}		context->video_decoder_initialized = TRUE;	}	return RM_OK;}static RMstatus initAudioDecoder(struct asf_context * context){    RMstatus status = RM_ERROR;    RMuint32 i;    RMuint16 EncoderOptions = 0;    RMuint16 wValidBitsPerSample = 0;    RMuint32 dwChannelMask = 0;    struct RMasfaudio_parameters *audio_params;    RMuint32 codec;        // Check that stream is enabled    if (context->audio_parameters[context->audio_stream_index].enabled != TRUE)    {        RMDBGLOG((ENABLE, "Audio channel #%d is disabled, audio init bypassed\n",context->audio_stream_index));        return RM_ERROR;    }     // Set audio decoder for current stream    if (context->audio_decoder_initialized == TRUE)        return RM_OK;	    // Get audio parameters    audio_params = &(context->audio_parameters[context->audio_stream_index]);	codec = (RMuint32) audio_params->Codec_ID;	RMDBGLOG((ENABLE, "initAudioDecoder: Stream %d instance %lu codec 0x%08lx\n",context->audio_stream_index, context->audioInstances, codec));	// Codec specific switch    switch (codec)    {	case 0x161:	case 0x7A21:	case 0x7A22:    {        //WMA        if (audio_params->Codec_Specific_Data_Size == 10)        { // 4 + 2 + 4            RMuint32      dwSamplesPerBlock;            dwSamplesPerBlock =                   (((RMuint32) audio_params->Codec_Specific_Data[3]) << 24)                + (((RMuint32) audio_params->Codec_Specific_Data[2]) << 16)                + (((RMuint32) audio_params->Codec_Specific_Data[1]) << 8)                +  ((RMuint32) audio_params->Codec_Specific_Data[0]);            EncoderOptions =                 + (((RMuint16) audio_params->Codec_Specific_Data[5]) << 8)                +  ((RMuint16) audio_params->Codec_Specific_Data[4]);            RMDBGLOG((ENABLE,                 "    Audio codec ID: %04x,\n"                "    Bits per block: 0x%04x\n"                "    Encode option: 0x%04x \n",                        (int) audio_params->Codec_ID, (int) dwSamplesPerBlock,                         (int) EncoderOptions));            }        else        {            RMDBGLOG((ENABLE, "Error: audio specific data has invalid size (%d)\n",                              (int) audio_params->Codec_Specific_Data_Size));            context->audio_parameters[context->audio_stream_index].enabled = FALSE;            return RM_ERROR;        }#ifdef WITH_MONO        RMDBGLOG((ENABLE, "set audio codec to WMA\n"));        for (i = 0; i < context->audioInstances; i++)            context->audio_opt[i].Codec = AudioDecoder_Codec_WMA;               context->isWMAPRO = FALSE;#endif    		break;    }	case 0x162:	{        // WMAPro        		RMstatus err;		RMMetaWMAParameters temp_wmaparams;        wValidBitsPerSample =             + (((RMuint16) audio_params->Codec_Specific_Data[1]) << 8)            +  ((RMuint16) audio_params->Codec_Specific_Data[0]);        dwChannelMask =               (((RMuint32) audio_params->Codec_Specific_Data[5]) << 24)            + (((RMuint32) audio_params->Codec_Specific_Data[4]) << 16)            + (((RMuint32) audio_params->Codec_Specific_Data[3]) << 8)            +  ((RMuint32) audio_params->Codec_Specific_Data[2]);        EncoderOptions =             + (((RMuint16) audio_params->Codec_Specific_Data[15]) << 8)            +  ((RMuint16) audio_params->Codec_Specific_Data[14]);                RMDBGLOG((ENABLE,               "    Audio codec ID: %04x,\n"              "    %u valid bits/sample, %08X channel mask\n"              "    0x%04x encode options\n",                      (int) audio_params->Codec_ID,   (int) wValidBitsPerSample,                       (int) dwChannelMask, (int) EncoderOptions));           // Get stored values		temp_wmaparams.VersionNumber = audio_params->Codec_ID;		temp_wmaparams.SamplingFrequency = audio_params->Samples_Per_Second;		temp_wmaparams.NumberOfChannels = audio_params->Number_of_Channels;		temp_wmaparams.Bitrate = audio_params->Average_Number_of_Bytes_Per_Second * 8;		temp_wmaparams.PacketSize = audio_params->Block_Alignment * 8;		temp_wmaparams.EncoderOptions = EncoderOptions;		temp_wmaparams.BitsPerSample = audio_params->Bits_Per_Sample;		temp_wmaparams.WMAProValidBitsPerSample = wValidBitsPerSample;		temp_wmaparams.WMAProChannelMask = dwChannelMask;		temp_wmaparams.WMAProVersionNumber = 0;		//temp_wmaparams.OutputChannels = audio_params->OutputChannels;				// Create video decoder only once        if(context->vDecoder == (void *)NULL)        {			RMDBGLOG((ENABLE,"******** using RMF's WMAPRO decoder ********\n"));			err = RMCreateWMAProVDecoder(&(context->vDecoder));			if (err != RM_OK)            {				RMDBGLOG((ENABLE,"error: cant create wmaproVdecoder!\n"));                context->audio_parameters[context->audio_stream_index].enabled = FALSE;				return RM_ERROR;			}						err = RMWMAProVDecoderOpen(context->vDecoder);			if (err != RM_OK)            {				RMDBGLOG((ENABLE,"error: cant open wmaproVdecoder!\n"));                context->audio_parameters[context->audio_stream_index].enabled = FALSE;				return RM_ERROR;			}		}				// Init video decoder        if (context->vDecoder != (void *)NULL)        {			err = RMWMAProVDecoderInit(context->vDecoder, 						   EncoderOptions,						   temp_wmaparams.PacketSize,						   &temp_wmaparams);			if (err != RM_OK)            {				RMDBGLOG((ENABLE, "wmaprodecoder init error\n"));                context->audio_parameters[context->audio_stream_index].enabled = FALSE;				return RM_ERROR;			}		}        else        {			RMDBGLOG((ENABLE, "calling wmaprodecoder init before open!\n"));            context->audio_parameters[context->audio_stream_index].enabled = FALSE;            return RM_ERROR;		}#ifdef WITH_MONO        RMDBGLOG((ENABLE, "set audio codec to WMAPro\n"));        for (i = 0; i < context->audioInstances; i++)            context->audio_opt[i].Codec = AudioDecoder_Codec_WMAPRO;        context->isWMAPRO = TRUE;#endif // WITH_MONO	if ((context->isWMAPRO) && (!context->pDMAuncompressed)) {		RMDBGLOG((ENABLE, "opening WMAPro DMApool, size %lu, bufferCount %lu bufferSize %lu\n",			  AUDIO_DMA_BUFFER_COUNT*(1<<AUDIO_DMA_BUFFER_SIZE_LOG2),			  AUDIO_DMA_BUFFER_COUNT,			  (1<<AUDIO_DMA_BUFFER_SIZE_LOG2)));		err = RUAOpenPool(context->dcc_info->pRUA, 0, AUDIO_DMA_BUFFER_COUNT, AUDIO_DMA_BUFFER_SIZE_LOG2, RUA_POOL_DIRECTION_SEND, &(context->pDMAuncompressed));		if (RMFAILED(err)) {			RMDBGLOG((ENABLE, "Error: cannot open dmapool for compressed audio - %d\n", err));			return err;		}	}        break;    }        	case 0x1: //PCM on ASF    {		RMDBGLOG((ENABLE, "PCM on ASF\n"));        context->audio_vop_tir = 90000;        DCCSTCSetTimeResolution(context->dcc_info->pStcSource, DCC_Audio, context->audio_vop_tir);#ifdef WITH_MONO        for (i = 0; i < context->audioInstances; i++)        {            context->audio_opt[i].PcmCdaParams.MsbFirst = FALSE;            context->audio_opt[i].Codec = AudioDecoder_Codec_PCM;            context->audio_opt[i].SubCodec = 0;                        if (audio_params->Number_of_Channels == 6)                context->audio_opt[i].PcmCdaParams.ChannelAssign = PcmCda6_LfRfCLfeLsRs;            else                context->audio_opt[i].PcmCdaParams.ChannelAssign = PcmCda2_LR;                        context->audio_opt[i].PcmCdaParams.BitsPerSample = audio_params->Bits_Per_Sample;                        if (!context->audio_opt[i].OutputChannelsExplicitAssign)                context->audio_opt[i].OutputChannels = Audio_Out_Ch_LR;        }        context->isWMAPRO = FALSE;#endif        break;    }	case 0x50: // mpeg on ASF		RMDBGLOG((ENABLE, "audio is MPEG\n"));		RMDBGLOG((ENABLE, ">> set audio time scale to 90000\n"));		context->audio_vop_tir = 90000;		DCCSTCSetTimeResolution(context->dcc_info->pStcSource, DCC_Audio, context->audio_vop_tir);		RMDBGLOG((ENABLE, ">> dont send audio pts\n"));		//pSendContext->SendAudioPts = FALSE;		break;    default:    {	        // wrong codec, should not happend as it is filtered before the call		fprintf(stderr, "error wrong codec %lx, disabling audio\n", codec);		context->audio_parameters[context->audio_stream_index].enabled = FALSE;		return RM_AUDIO_CODEC_NOT_SUPPORTED;	}    }	    if ((context->audio_opt[0].Spdif == OutputSpdif_NoDecodeCompressed) || (context->audio_opt[0].Spdif == OutputSpdif_Compressed))        context->isWMAPRO = FALSE;	// Send audio for this channel    context->audio_parameters[context->audio_stream_index].enabled = TRUE;        // Apply parameters    if (codec != 0x163)    { // any different from WMALSL				struct AudioDecoder_WMAParameters_type wma_params;                // apply the audio format - uninit, set codec, set specific parameters, init		RMDBGLOG((ENABLE, "apply audio decoder options\n"));		        // Fill wmaparams structure        wma_params.VersionNumber = audio_params->Codec_ID;        wma_params.SamplingFrequency = audio_params->Samples_Per_Second;        wma_params.NumberOfChannels = audio_params->Number_of_Channels;        wma_params.Bitrate = audio_params->Average_Number_of_Bytes_Per_Second * 8;        wma_params.PacketSize = audio_params->Block_Alignment * 8;        wma_params.EncoderOptions = EncoderOptions;        wma_params.BitsPerSample = audio_params->Bits_Per_Sample;        wma_params.WMAProValidBitsPerSample = wValidBitsPerSample;        wma_params.WMAProChannelMask = dwChannelMask;        wma_params.WMAProVersionNumber = 0;        /* TODO: need to handle dualmode for each audio decoder */        wma_params.OutputDualMode = context->audio_opt[0].OutputDualMode;        wma_params.OutputSpdif = context->audio_opt[0].Spdif;                    for (i = 0; i < context->audioInstances; i++)        {            memcpy(&context->audio_opt[i].WmaParams, &wma_params, sizeof(struct AudioDecoder_WMAParameters_type));            			/*******************************************************************************			  Upsampling WMA or WMAPRO audio for SPDIF and HDMI output			********************************************************************************/			if(context->audio_opt[i].ForceSampleRate != TRUE)			{				context->audio_opt[i].SampleRate = wma_params.SamplingFrequency;				if(wma_params.SamplingFrequency < 32000)				{					if(wma_params.SamplingFrequency == 8000)					{						context->audio_opt[i].SampleRate = 32000;					}					else if(wma_params.SamplingFrequency == 11025)					{						context->audio_opt[i].SampleRate = 44100;					}					else if(wma_params.SamplingFrequency == 12000)					{						context->audio_opt[i].SampleRate = 48000;					}					else if(wma_params.SamplingFrequency == 16000)					{						context->audio_opt[i].SampleRate = 32000;					}					else if(wma_params.SamplingFrequency == 22050)					{						context->audio_opt[i].SampleRate = 44100;					}					else if(wma_params.SamplingFrequency == 24000)					{						context->audio_opt[i].SampleRate = 48000;					}				}				RMDBGLOG((ENABLE, ">> forcing output sample rate to %lu (stream sample rate %lu)\n",                                    context->audio_opt[i].SampleRate, wma_params.SamplingFrequency));			}			/**************************************************************************/			// apply the sample rate, serial out status			RMDBGLOG((ENABLE, "apply audio engine options\n"));			status = apply_audio_engine_options(context->dcc_info, &(context->audio_opt[i]));			if(status != RM_OK)            {							RMDBGLOG((ENABLE, "Cannot apply audio engine options ... disabling audio, error = %d\n", status));				context->audio_parameters[context->audio_stream_index].enabled = FALSE;                return RM_ERROR;			}						status = apply_audio_decoder_options(context->dcc_info, &(context->audio_opt[i]));			if (RMFAILED(status))            {				RMDBGLOG((ENABLE, "Error applying audio_decoder_options %d\n", status));    					context->audio_parameters[context->audio_stream_index].enabled = FALSE;    					return RM_ERROR;            }    				    			apply_dvi_hdmi_audio_options(context->dcc_info, &(context->audio_opt[i]),                                                wma_params.NumberOfChannels, TRUE, TRUE, FALSE);        }#ifndef WITH_MONO        if (! context->disp_opt->configure_outports)                apply_hdcp(context->dcc_info, context->disp_opt);#endif    }#ifdef _ENABLE_WMALSL_    else    { // WMALSL       for (i = 0; i < context->audioInstances; i++)       { 			context->audio_opt[i].Codec = AudioDecoder_Codec_PCM;			context->audio_opt[i].SubCodec = 0;			context->audio_opt[i].SampleRate = audio_params->Samples_Per_Second;			context->audio_opt[i].OutputChannels = Audio_Out_Ch_LR;			context->audio_opt[i].PcmCdaParams.ChannelAssign = PcmCda2_LR;			context->audio_opt[i].PcmCdaParams.BitsPerSample = audio_params;			context->audio_opt[i].PcmCdaParams.MsbFirst = FALSE;						// apply the sample rate, serial out status			status = apply_audio_engine_options(context->dcc_info, &(context->audio_opt[i]));			if(status != RM_OK)            {				RMDBGLOG((ENABLE, "Cannot apply audio engine options ... disabling audio, error = %d\n", status));				context->audio_parameters[context->audio_stream_index].enabled = FALSE;                return RM_ERROR;			}						status = apply_audio_decoder_options(context->dcc_info, &(context->audio_opt[i]));			RMDBGLOG((ENABLE, " set PCM codec for WMALSL, Sampling Freq=%lu\n", context->audio_opt[i].SampleRate));			DCCSTCSetTimeResolution(context->dcc_info->pStcSource, DCC_Audio, 90000);			if(status != RM_OK)            {							RMDBGLOG((ENABLE, "Cannot apply audio decoder options ... disabling audio, error = %d\n", status));        					context->audio_parameters[context->audio_stream_index].enabled = FALSE;        		return RM_ERROR;            }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -