rtpdec: Free depacketizers if the init function failed
This is different from how it is handled in codecs/demuxers/muxers though (where the close function isn't called if the open function failed), but since the number of depacketizers that have an .init function is quite limited, this is easy to change. The main point is that if the init function failed, we shouldn't try to use that depacketizer at all - this makes sure that the parse function doesn't need to check for the things that were initialized in the init function. Signed-off-by: Martin Storsjö <martin@martin.st>
This commit is contained in:
parent
bb4a310bb8
commit
078d43e23a
@ -298,9 +298,6 @@ rdt_parse_packet (AVFormatContext *ctx, PayloadContext *rdt, AVStream *st,
|
|||||||
int seq = 1, res;
|
int seq = 1, res;
|
||||||
AVIOContext pb;
|
AVIOContext pb;
|
||||||
|
|
||||||
if (!rdt->rmctx)
|
|
||||||
return AVERROR(EINVAL);
|
|
||||||
|
|
||||||
if (rdt->audio_pkt_cnt == 0) {
|
if (rdt->audio_pkt_cnt == 0) {
|
||||||
int pos;
|
int pos;
|
||||||
|
|
||||||
|
@ -129,7 +129,7 @@ struct RTPDynamicProtocolHandler {
|
|||||||
PayloadContext *priv_data, const char *line);
|
PayloadContext *priv_data, const char *line);
|
||||||
/** Free any data needed by the rtp parsing for this dynamic data.
|
/** 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
|
* 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);
|
void (*free)(PayloadContext *protocol_data);
|
||||||
/** Parse handler for this dynamic packet */
|
/** Parse handler for this dynamic packet */
|
||||||
DynamicPayloadPacketHandlerProc parse_packet;
|
DynamicPayloadPacketHandlerProc parse_packet;
|
||||||
|
@ -60,9 +60,6 @@ static int mpegts_handle_packet(AVFormatContext *ctx, PayloadContext *data,
|
|||||||
// different ranges.
|
// different ranges.
|
||||||
*timestamp = RTP_NOTS_VALUE;
|
*timestamp = RTP_NOTS_VALUE;
|
||||||
|
|
||||||
if (!data->ts)
|
|
||||||
return AVERROR(EINVAL);
|
|
||||||
|
|
||||||
if (!buf) {
|
if (!buf) {
|
||||||
if (data->read_buf_index >= data->read_buf_size)
|
if (data->read_buf_index >= data->read_buf_size)
|
||||||
return AVERROR(EAGAIN);
|
return AVERROR(EAGAIN);
|
||||||
|
@ -193,6 +193,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>] */
|
/* parse the rtpmap description: <codec_name>/<clock_rate>[/<other params>] */
|
||||||
static int sdp_parse_rtpmap(AVFormatContext *s,
|
static int sdp_parse_rtpmap(AVFormatContext *s,
|
||||||
AVStream *st, RTSPStream *rtsp_st,
|
AVStream *st, RTSPStream *rtsp_st,
|
||||||
@ -261,9 +280,7 @@ static int sdp_parse_rtpmap(AVFormatContext *s,
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (rtsp_st->dynamic_handler && rtsp_st->dynamic_handler->init)
|
finalize_rtp_handler_init(s, rtsp_st, st);
|
||||||
rtsp_st->dynamic_handler->init(s, st->index,
|
|
||||||
rtsp_st->dynamic_protocol_context);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -444,8 +461,7 @@ static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1,
|
|||||||
handler = ff_rtp_handler_find_by_id(
|
handler = ff_rtp_handler_find_by_id(
|
||||||
rtsp_st->sdp_payload_type, AVMEDIA_TYPE_DATA);
|
rtsp_st->sdp_payload_type, AVMEDIA_TYPE_DATA);
|
||||||
init_rtp_handler(handler, rtsp_st, NULL);
|
init_rtp_handler(handler, rtsp_st, NULL);
|
||||||
if (handler && handler->init)
|
finalize_rtp_handler_init(s, rtsp_st, NULL);
|
||||||
handler->init(s, -1, rtsp_st->dynamic_protocol_context);
|
|
||||||
}
|
}
|
||||||
} else if (rt->server_type == RTSP_SERVER_WMS &&
|
} else if (rt->server_type == RTSP_SERVER_WMS &&
|
||||||
codec_type == AVMEDIA_TYPE_DATA) {
|
codec_type == AVMEDIA_TYPE_DATA) {
|
||||||
@ -469,9 +485,7 @@ static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1,
|
|||||||
handler = ff_rtp_handler_find_by_id(
|
handler = ff_rtp_handler_find_by_id(
|
||||||
rtsp_st->sdp_payload_type, st->codec->codec_type);
|
rtsp_st->sdp_payload_type, st->codec->codec_type);
|
||||||
init_rtp_handler(handler, rtsp_st, st);
|
init_rtp_handler(handler, rtsp_st, st);
|
||||||
if (handler && handler->init)
|
finalize_rtp_handler_init(s, rtsp_st, st);
|
||||||
handler->init(s, st->index,
|
|
||||||
rtsp_st->dynamic_protocol_context);
|
|
||||||
}
|
}
|
||||||
if (rt->default_lang[0])
|
if (rt->default_lang[0])
|
||||||
av_dict_set(&st->metadata, "language", rt->default_lang, 0);
|
av_dict_set(&st->metadata, "language", rt->default_lang, 0);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user