test.cpp 2.1 KB

extern "C" {
#include <libavformat/rtpdec.h>
#include <libavcodec/avcodec.h>
}

#define RTP_PAYLOAD_TYPE 96
#define RTP_CLOCK_RATE 90000
#define BIT_RATE 1000000
#define VIDEO_WIDTH 1280
#define VIDEO_HEIGHT 720
AVCodecContext *codec_ctx = NULL;
AVPacket rtp_packet;
uint8_t *rtp_payload = NULL;
int rtp_payload_size = 0;
int rtp_ret;
int main(int argc, char *argv[])
{
	uint8_t buffer[1500];
	uint32_t timestamp;
	int len, marker;
	av_register_all();
	avcodec_register_all();
	av_register_rtp_dynamic_payload_handlers();
	AVRtpPayloadTypes *payload_types = av_malloc(sizeof(AVRtpPayloadTypes));
	if (!payload_types) {
		return -1;
	}
	RTPDynamicProtocolHandler dynamic_handler = { 0 };
	payload_types->pt = RTP_PAYLOAD_TYPE;
	payload_types->next = NULL;
	payload_types->handler = &dynamic_handler;
	codec_ctx = avcodec_alloc_context3(NULL);
	if (!codec_ctx) {
		av_freep(&payload_types);
		return -1;
	}
	codec_ctx->codec_type = AVMEDIA_TYPE_VIDEO;
	codec_ctx->codec_id = AV_CODEC_ID_H264;
	codec_ctx->pkt_timebase = (AVRational) { 1, RTP_CLOCK_RATE };
	codec_ctx->time_base = codec_ctx->pkt_timebase;
	codec_ctx->bit_rate = BIT_RATE;
	codec_ctx->width = VIDEO_WIDTH;
	codec_ctx->height = VIDEO_HEIGHT;
	codec_ctx->pix_fmt = AV_PIX_FMT_YUV420P;
	codec_ctx->flags |= AV_CODEC_FLAG_TRUNCATED | AV_CODEC_FLAG_GLOBAL_HEADER;
	while (1) {
		len = read_rtp_packet(buffer, sizeof(buffer), timestamp, &marker);
		if (len < 0)
			break;
		rtp_payload_size = len - 2;
		rtp_payload = (uint8_t *)buffer + 2;
		memset(&rtp_packet, 0, sizeof(AVPacket));
		av_init_packet(&rtp_packet);
		rtp_ret = av_rtp_parse_packet(codec_ctx, payload_types, &rtp_payload, &rtp_payload_size, timestamp, marker);
		if (rtp_ret >= 0) {
			rtp_packet.data = rtp_payload;
			rtp_packet.size = rtp_payload_size;
			rtp_packet.pts = timestamp;
			rtp_packet.dts = timestamp;
			rtp_packet.duration = 0;
			rtp_packet.stream_index = 0;
			rtp_packet.flags |= AV_PKT_FLAG_KEY;
			// �������rtp_packet�����
		}
	}
	avcodec_free_context(&codec_ctx);
	av_freep(&payload_types);
	return 0;
}