mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-11-26 19:01:44 +02:00
Merge commit '078d43e23a7a3d64aafee8a58b380d3e139b3020'
* commit '078d43e23a7a3d64aafee8a58b380d3e139b3020': rtpdec: Free depacketizers if the init function failed Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
commit
79052cd4ce
@ -298,9 +298,6 @@ rdt_parse_packet (AVFormatContext *ctx, PayloadContext *rdt, AVStream *st,
|
||||
int seq = 1, res;
|
||||
AVIOContext pb;
|
||||
|
||||
if (!rdt->rmctx)
|
||||
return AVERROR(EINVAL);
|
||||
|
||||
if (rdt->audio_pkt_cnt == 0) {
|
||||
int pos;
|
||||
|
||||
|
@ -129,7 +129,7 @@ struct RTPDynamicProtocolHandler {
|
||||
PayloadContext *priv_data, const char *line);
|
||||
/** Free any data needed by the rtp parsing for this dynamic data.
|
||||
* Don't free the protocol_data pointer itself, that is freed by the
|
||||
* caller. */
|
||||
* caller. This is called even if the init method failed. */
|
||||
void (*free)(PayloadContext *protocol_data);
|
||||
/** Parse handler for this dynamic packet */
|
||||
DynamicPayloadPacketHandlerProc parse_packet;
|
||||
|
@ -60,9 +60,6 @@ static int mpegts_handle_packet(AVFormatContext *ctx, PayloadContext *data,
|
||||
// different ranges.
|
||||
*timestamp = RTP_NOTS_VALUE;
|
||||
|
||||
if (!data->ts)
|
||||
return AVERROR(EINVAL);
|
||||
|
||||
if (!buf) {
|
||||
if (data->read_buf_index >= data->read_buf_size)
|
||||
return AVERROR(EAGAIN);
|
||||
|
@ -198,6 +198,25 @@ static void init_rtp_handler(RTPDynamicProtocolHandler *handler,
|
||||
}
|
||||
}
|
||||
|
||||
static void finalize_rtp_handler_init(AVFormatContext *s, RTSPStream *rtsp_st,
|
||||
AVStream *st)
|
||||
{
|
||||
if (rtsp_st->dynamic_handler && rtsp_st->dynamic_handler->init) {
|
||||
int ret = rtsp_st->dynamic_handler->init(s, st ? st->index : -1,
|
||||
rtsp_st->dynamic_protocol_context);
|
||||
if (ret < 0) {
|
||||
if (rtsp_st->dynamic_protocol_context) {
|
||||
if (rtsp_st->dynamic_handler->free)
|
||||
rtsp_st->dynamic_handler->free(
|
||||
rtsp_st->dynamic_protocol_context);
|
||||
av_free(rtsp_st->dynamic_protocol_context);
|
||||
}
|
||||
rtsp_st->dynamic_protocol_context = NULL;
|
||||
rtsp_st->dynamic_handler = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* parse the rtpmap description: <codec_name>/<clock_rate>[/<other params>] */
|
||||
static int sdp_parse_rtpmap(AVFormatContext *s,
|
||||
AVStream *st, RTSPStream *rtsp_st,
|
||||
@ -266,9 +285,7 @@ static int sdp_parse_rtpmap(AVFormatContext *s,
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (rtsp_st->dynamic_handler && rtsp_st->dynamic_handler->init)
|
||||
rtsp_st->dynamic_handler->init(s, st->index,
|
||||
rtsp_st->dynamic_protocol_context);
|
||||
finalize_rtp_handler_init(s, rtsp_st, st);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -451,8 +468,7 @@ static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1,
|
||||
handler = ff_rtp_handler_find_by_id(
|
||||
rtsp_st->sdp_payload_type, AVMEDIA_TYPE_DATA);
|
||||
init_rtp_handler(handler, rtsp_st, NULL);
|
||||
if (handler && handler->init)
|
||||
handler->init(s, -1, rtsp_st->dynamic_protocol_context);
|
||||
finalize_rtp_handler_init(s, rtsp_st, NULL);
|
||||
}
|
||||
} else if (rt->server_type == RTSP_SERVER_WMS &&
|
||||
codec_type == AVMEDIA_TYPE_DATA) {
|
||||
@ -476,9 +492,7 @@ static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1,
|
||||
handler = ff_rtp_handler_find_by_id(
|
||||
rtsp_st->sdp_payload_type, st->codec->codec_type);
|
||||
init_rtp_handler(handler, rtsp_st, st);
|
||||
if (handler && handler->init)
|
||||
handler->init(s, st->index,
|
||||
rtsp_st->dynamic_protocol_context);
|
||||
finalize_rtp_handler_init(s, rtsp_st, st);
|
||||
}
|
||||
if (rt->default_lang[0])
|
||||
av_dict_set(&st->metadata, "language", rt->default_lang, 0);
|
||||
|
Loading…
Reference in New Issue
Block a user