From patchwork Wed Jan 3 00:42:45 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josh Dekker X-Patchwork-Id: 7089 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.79.195 with SMTP id r64csp15301452jad; Tue, 2 Jan 2018 16:43:01 -0800 (PST) X-Google-Smtp-Source: ACJfBosBxSp94u0bwggV6FvId6BHbuhjoJmJsaD01Wk/SmP1cGcTET5YNQnkabYGmjA3D9AFZemv X-Received: by 10.223.196.19 with SMTP id v19mr42792239wrf.135.1514940181054; Tue, 02 Jan 2018 16:43:01 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1514940181; cv=none; d=google.com; s=arc-20160816; b=JuzfgGF5J31Z6i+Gxflu0lZHjT4o5Lw4QhtF5s3L8dTMZtdAmy0EDHSOyXo7bVX+CR C++h9MKgndaX/UjuQbo6GXQo9l2mDCqTtAazpJvQD1bckLysQjbY0+kAgJbFej3fMhB/ up4LkokILomP5ToAtJW2zyRO8DZRKnSEjNDMurBFYOCVZigCqJ04NMnHbSS4QHc4v7b0 /fs3qW7bJr96uHNdoWBNQKTYKieBibfgeiYGPGmV3ORR8OLtPPyU4oIw2Oq6Xs4PRF3C G9L65Iu7l2vC9XvYwbm9bKNu08DNThqBcdaDDVuV35fN2mN9cDy0j0ZxBncEpenY28EF oWRw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:message-id:to:from:date :dkim-signature:dkim-signature:delivered-to :arc-authentication-results; bh=Gva7SE/9hezl3fP1OszbFNLNz1p8XiD2RSqplPsNBW4=; b=rEa/94UOoIqlqSmo3wlHN/Y0Q1v8+z02BvMRFuN4YG2Ik+WZJTBFL3iXC9i2DbHWRD j5TF6L/uYIuXZfmAFe7uszLv/3jtIvs3aoSdc9bkhzD1cZQ+s5Vdy/ZkEQZgMVHX1DfX oZuLI0rphQc1ZTPMibHcjdRvV7z1DmT1BWfbFTRZ+67VotO+ygE1pdyuDTH8TfMR4uaC VE2ctLN3Py8JYrd4+xMwHPCWegy9vUz8YvzjuxPsduhY35wdaTs5pLf5+nfS2/hQxmBE KK2gUPNCJaPhEUrSBU76BQZU+sj6IZN5FQzaRZZyaefw7Trg/TXUxJpw/VyrqaDjjqwJ g7SA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@itanimul.li header.s=mesmtp header.b=mFB7YUaR; dkim=neutral (body hash did not verify) header.i=@messagingengine.com header.s=fm1 header.b=l8fpqN++; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a5si19453745wrf.227.2018.01.02.16.43.00; Tue, 02 Jan 2018 16:43:01 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@itanimul.li header.s=mesmtp header.b=mFB7YUaR; dkim=neutral (body hash did not verify) header.i=@messagingengine.com header.s=fm1 header.b=l8fpqN++; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D7FA4688312; Wed, 3 Jan 2018 02:42:37 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from out2-smtp.messagingengine.com (out2-smtp.messagingengine.com [66.111.4.26]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 95CD66882FD for ; Wed, 3 Jan 2018 02:42:31 +0200 (EET) Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id 1BE7E20CB2 for ; Tue, 2 Jan 2018 19:42:47 -0500 (EST) Received: from frontend1 ([10.202.2.160]) by compute4.internal (MEProxy); Tue, 02 Jan 2018 19:42:47 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=itanimul.li; h= content-transfer-encoding:content-type:date:from:message-id :mime-version:subject:to:x-me-sender:x-me-sender:x-sasl-enc; s= mesmtp; bh=6dz+ZG7t7wbJApPoEefwxwPOBfCiuQUvX6XcsbwBgoE=; b=mFB7Y UaRsWQhmy0oVuLKnpmwigIeO49eOMWhNZwAly941g3ZMer1KwXHIDaMcaAybYB98 nUN4GtgsO79q+qblYaUqtB1/Chb+kYYFONig5feloc503K+EZH/6ZASIcMJp5jb/ r0IvSkAcH0SNAvl+OIL7ZpgCSwWVvIMSLbEffo= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=content-transfer-encoding:content-type :date:from:message-id:mime-version:subject:to:x-me-sender :x-me-sender:x-sasl-enc; s=fm1; bh=6dz+ZG7t7wbJApPoEefwxwPOBfCiu QUvX6XcsbwBgoE=; b=l8fpqN++ueGh32+ttEH/o5pZ63sGNNDZ7kPkF8RT/BdOx vSBTl9zTaUpUbXSzx5IuqHJuK89jKAKdui/b6fwgN7Ee/+Awdot9gjgfL4EQ3c9M 3isKyV361z1ExEtLZNoPVsBBZUqoJI36MakY6IUIrsoHZZkUvej8UNQ+hBLLdp0O yyMVI/3wUzCE2pnuTeL0M/DDNoLRhTXBSUtUimRJ7QxW14ZmVASP5Tyvcr30sFrJ dc0l5v9h0OMDfr0I6V0FSyzn77PXIJ9V3XN9F5hzSdGjzWoec+ibGJtfQxtDjrPt igF9JNaOQKfPCs2axPcMCf/p7TnLhh1SUYwEOf2lg== X-ME-Sender: Received: from DESKTOP-AFAL1BE (cpc75394-sotn16-2-0-cust168.15-1.cable.virginm.net [82.22.8.169]) by mail.messagingengine.com (Postfix) with ESMTPA id 9237B7E335 for ; Tue, 2 Jan 2018 19:42:46 -0500 (EST) Date: Wed, 3 Jan 2018 00:42:45 +0000 From: Josh de Kock To: ffmpeg-devel@ffmpeg.org Message-Id: <20180103004245.a673c6df422e8978cd6cde62@itanimul.li> X-Mailer: Sylpheed 3.5.1 (GTK+ 2.24.23; i686-pc-mingw32) Mime-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/6] lavf/rtp: replace linked list with array X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- libavformat/allformats.c | 4 -- libavformat/rdt.c | 8 +-- libavformat/rdt.h | 3 + libavformat/rtpdec.c | 157 ++++++++++++++++++++++++++++++----------------- libavformat/rtpdec.h | 29 ++++++++- libavformat/version.h | 4 +- 6 files changed, 136 insertions(+), 69 deletions(-) diff --git a/libavformat/allformats.c b/libavformat/allformats.c index 6a9b988..593baf3 100644 --- a/libavformat/allformats.c +++ b/libavformat/allformats.c @@ -283,10 +283,6 @@ static void register_all(void) REGISTER_DEMUXER (SDR2, sdr2); REGISTER_DEMUXER (SDS, sds); REGISTER_DEMUXER (SDX, sdx); -#if CONFIG_RTPDEC - ff_register_rtp_dynamic_payload_handlers(); - ff_register_rdt_dynamic_payload_handlers(); -#endif REGISTER_DEMUXER (SEGAFILM, segafilm); REGISTER_MUXER (SEGMENT, segment); REGISTER_MUXER (SEGMENT, stream_segment); diff --git a/libavformat/rdt.c b/libavformat/rdt.c index b69827f..4d6321e 100644 --- a/libavformat/rdt.c +++ b/libavformat/rdt.c @@ -554,7 +554,7 @@ rdt_close_context (PayloadContext *rdt) } #define RDT_HANDLER(n, s, t) \ -static RTPDynamicProtocolHandler rdt_ ## n ## _handler = { \ +RTPDynamicProtocolHandler ff_rdt_ ## n ## _handler = { \ .enc_name = s, \ .codec_type = t, \ .codec_id = AV_CODEC_ID_NONE, \ @@ -570,10 +570,8 @@ RDT_HANDLER(live_audio, "x-pn-multirate-realaudio-live", AVMEDIA_TYPE_AUDIO); RDT_HANDLER(video, "x-pn-realvideo", AVMEDIA_TYPE_VIDEO); RDT_HANDLER(audio, "x-pn-realaudio", AVMEDIA_TYPE_AUDIO); +#if FF_API_RTP_NEXT void ff_register_rdt_dynamic_payload_handlers(void) { - ff_register_dynamic_payload_handler(&rdt_video_handler); - ff_register_dynamic_payload_handler(&rdt_audio_handler); - ff_register_dynamic_payload_handler(&rdt_live_video_handler); - ff_register_dynamic_payload_handler(&rdt_live_audio_handler); } +#endif diff --git a/libavformat/rdt.h b/libavformat/rdt.h index ce6026f..a87057d 100644 --- a/libavformat/rdt.h +++ b/libavformat/rdt.h @@ -59,10 +59,13 @@ void ff_rdt_parse_close(RDTDemuxContext *s); void ff_rdt_calc_response_and_checksum(char response[41], char chksum[9], const char *challenge); +#if FF_API_RTP_NEXT /** * Register RDT-related dynamic payload handlers with our cache. */ +attribute_deprecated void ff_register_rdt_dynamic_payload_handlers(void); +#endif /** * Add subscription information to Subscribe parameter string. diff --git a/libavformat/rtpdec.c b/libavformat/rtpdec.c index 4acb1ca..2e777c9 100644 --- a/libavformat/rtpdec.c +++ b/libavformat/rtpdec.c @@ -22,6 +22,7 @@ #include "libavutil/mathematics.h" #include "libavutil/avstring.h" #include "libavutil/intreadwrite.h" +#include "libavutil/thread.h" #include "libavutil/time.h" #include "avformat.h" @@ -69,88 +70,130 @@ static RTPDynamicProtocolHandler t140_dynamic_handler = { /* RFC 4103 */ .codec_id = AV_CODEC_ID_TEXT, }; -static RTPDynamicProtocolHandler *rtp_first_dynamic_payload_handler = NULL; +extern RTPDynamicProtocolHandler ff_rdt_video_handler; +extern RTPDynamicProtocolHandler ff_rdt_audio_handler; +extern RTPDynamicProtocolHandler ff_rdt_live_video_handler; +extern RTPDynamicProtocolHandler ff_rdt_live_audio_handler; + +static const RTPDynamicProtocolHandler *rtp_dynamic_protocol_handler_list[] = { + /* rtp */ + &ff_ac3_dynamic_handler, + &ff_amr_nb_dynamic_handler, + &ff_amr_wb_dynamic_handler, + &ff_dv_dynamic_handler, + &ff_g726_16_dynamic_handler, + &ff_g726_24_dynamic_handler, + &ff_g726_32_dynamic_handler, + &ff_g726_40_dynamic_handler, + &ff_g726le_16_dynamic_handler, + &ff_g726le_24_dynamic_handler, + &ff_g726le_32_dynamic_handler, + &ff_g726le_40_dynamic_handler, + &ff_h261_dynamic_handler, + &ff_h263_1998_dynamic_handler, + &ff_h263_2000_dynamic_handler, + &ff_h263_rfc2190_dynamic_handler, + &ff_h264_dynamic_handler, + &ff_hevc_dynamic_handler, + &ff_ilbc_dynamic_handler, + &ff_jpeg_dynamic_handler, + &ff_mp4a_latm_dynamic_handler, + &ff_mp4v_es_dynamic_handler, + &ff_mpeg_audio_dynamic_handler, + &ff_mpeg_audio_robust_dynamic_handler, + &ff_mpeg_video_dynamic_handler, + &ff_mpeg4_generic_dynamic_handler, + &ff_mpegts_dynamic_handler, + &ff_ms_rtp_asf_pfa_handler, + &ff_ms_rtp_asf_pfv_handler, + &ff_qcelp_dynamic_handler, + &ff_qdm2_dynamic_handler, + &ff_qt_rtp_aud_handler, + &ff_qt_rtp_vid_handler, + &ff_quicktime_rtp_aud_handler, + &ff_quicktime_rtp_vid_handler, + &ff_rfc4175_rtp_handler, + &ff_svq3_dynamic_handler, + &ff_theora_dynamic_handler, + &ff_vc2hq_dynamic_handler, + &ff_vorbis_dynamic_handler, + &ff_vp8_dynamic_handler, + &ff_vp9_dynamic_handler, + &gsm_dynamic_handler, + &l24_dynamic_handler, + &opus_dynamic_handler, + &realmedia_mp3_dynamic_handler, + &speex_dynamic_handler, + &t140_dynamic_handler, + /* rdt */ + &ff_rdt_video_handler, + &ff_rdt_audio_handler, + &ff_rdt_live_video_handler, + &ff_rdt_live_audio_handler, + NULL, +}; + +const RTPDynamicProtocolHandler *ff_rtp_handler_iterate(void **opaque) +{ + uintptr_t i = (uintptr_t)*opaque; + const RTPDynamicProtocolHandler *r = rtp_dynamic_protocol_handler_list[i]; + + if (r) + *opaque = (void*)(i + 1); + + return r; +} + +#if FF_API_NEXT +pthread_once_t ff_rtp_handler_next_init = PTHREAD_ONCE_INIT; + +static void ff_rtp_handler_init_next(void) +{ + AVCodec *prev = NULL, *p; + void *i = 0; + while ((p = (AVCodec*)av_codec_iterate(&i))) { + if (prev) + prev->next = p; + prev = p; + } + prev->next = NULL; +} void ff_register_dynamic_payload_handler(RTPDynamicProtocolHandler *handler) { - handler->next = rtp_first_dynamic_payload_handler; - rtp_first_dynamic_payload_handler = handler; + pthread_once(&ff_rtp_handler_next_init, ff_rtp_handler_init_next); } void ff_register_rtp_dynamic_payload_handlers(void) { - ff_register_dynamic_payload_handler(&ff_ac3_dynamic_handler); - ff_register_dynamic_payload_handler(&ff_amr_nb_dynamic_handler); - ff_register_dynamic_payload_handler(&ff_amr_wb_dynamic_handler); - ff_register_dynamic_payload_handler(&ff_dv_dynamic_handler); - ff_register_dynamic_payload_handler(&ff_g726_16_dynamic_handler); - ff_register_dynamic_payload_handler(&ff_g726_24_dynamic_handler); - ff_register_dynamic_payload_handler(&ff_g726_32_dynamic_handler); - ff_register_dynamic_payload_handler(&ff_g726_40_dynamic_handler); - ff_register_dynamic_payload_handler(&ff_g726le_16_dynamic_handler); - ff_register_dynamic_payload_handler(&ff_g726le_24_dynamic_handler); - ff_register_dynamic_payload_handler(&ff_g726le_32_dynamic_handler); - ff_register_dynamic_payload_handler(&ff_g726le_40_dynamic_handler); - ff_register_dynamic_payload_handler(&ff_h261_dynamic_handler); - ff_register_dynamic_payload_handler(&ff_h263_1998_dynamic_handler); - ff_register_dynamic_payload_handler(&ff_h263_2000_dynamic_handler); - ff_register_dynamic_payload_handler(&ff_h263_rfc2190_dynamic_handler); - ff_register_dynamic_payload_handler(&ff_h264_dynamic_handler); - ff_register_dynamic_payload_handler(&ff_hevc_dynamic_handler); - ff_register_dynamic_payload_handler(&ff_ilbc_dynamic_handler); - ff_register_dynamic_payload_handler(&ff_jpeg_dynamic_handler); - ff_register_dynamic_payload_handler(&ff_mp4a_latm_dynamic_handler); - ff_register_dynamic_payload_handler(&ff_mp4v_es_dynamic_handler); - ff_register_dynamic_payload_handler(&ff_mpeg_audio_dynamic_handler); - ff_register_dynamic_payload_handler(&ff_mpeg_audio_robust_dynamic_handler); - ff_register_dynamic_payload_handler(&ff_mpeg_video_dynamic_handler); - ff_register_dynamic_payload_handler(&ff_mpeg4_generic_dynamic_handler); - ff_register_dynamic_payload_handler(&ff_mpegts_dynamic_handler); - ff_register_dynamic_payload_handler(&ff_ms_rtp_asf_pfa_handler); - ff_register_dynamic_payload_handler(&ff_ms_rtp_asf_pfv_handler); - ff_register_dynamic_payload_handler(&ff_qcelp_dynamic_handler); - ff_register_dynamic_payload_handler(&ff_qdm2_dynamic_handler); - ff_register_dynamic_payload_handler(&ff_qt_rtp_aud_handler); - ff_register_dynamic_payload_handler(&ff_qt_rtp_vid_handler); - ff_register_dynamic_payload_handler(&ff_quicktime_rtp_aud_handler); - ff_register_dynamic_payload_handler(&ff_quicktime_rtp_vid_handler); - ff_register_dynamic_payload_handler(&ff_rfc4175_rtp_handler); - ff_register_dynamic_payload_handler(&ff_svq3_dynamic_handler); - ff_register_dynamic_payload_handler(&ff_theora_dynamic_handler); - ff_register_dynamic_payload_handler(&ff_vc2hq_dynamic_handler); - ff_register_dynamic_payload_handler(&ff_vorbis_dynamic_handler); - ff_register_dynamic_payload_handler(&ff_vp8_dynamic_handler); - ff_register_dynamic_payload_handler(&ff_vp9_dynamic_handler); - ff_register_dynamic_payload_handler(&gsm_dynamic_handler); - ff_register_dynamic_payload_handler(&l24_dynamic_handler); - ff_register_dynamic_payload_handler(&opus_dynamic_handler); - ff_register_dynamic_payload_handler(&realmedia_mp3_dynamic_handler); - ff_register_dynamic_payload_handler(&speex_dynamic_handler); - ff_register_dynamic_payload_handler(&t140_dynamic_handler); + pthread_once(&ff_rtp_handler_next_init, ff_rtp_handler_init_next); } +#endif RTPDynamicProtocolHandler *ff_rtp_handler_find_by_name(const char *name, enum AVMediaType codec_type) { - RTPDynamicProtocolHandler *handler; - for (handler = rtp_first_dynamic_payload_handler; - handler; handler = handler->next) + void *i = 0; + const RTPDynamicProtocolHandler *handler; + while (handler = ff_rtp_handler_iterate(&i)) { if (handler->enc_name && !av_strcasecmp(name, handler->enc_name) && codec_type == handler->codec_type) return handler; + } return NULL; } RTPDynamicProtocolHandler *ff_rtp_handler_find_by_id(int id, enum AVMediaType codec_type) { - RTPDynamicProtocolHandler *handler; - for (handler = rtp_first_dynamic_payload_handler; - handler; handler = handler->next) + void *i = 0; + const RTPDynamicProtocolHandler *handler; + while (handler = ff_rtp_handler_iterate(&i)) { if (handler->static_payload_id && handler->static_payload_id == id && codec_type == handler->codec_type) return handler; + } return NULL; } diff --git a/libavformat/rtpdec.h b/libavformat/rtpdec.h index 77596b6..e59c99c 100644 --- a/libavformat/rtpdec.h +++ b/libavformat/rtpdec.h @@ -192,9 +192,36 @@ struct RTPDemuxContext { PayloadContext *dynamic_protocol_context; }; +#if FF_API_RTP_NEXT +attribute_deprecated void ff_register_dynamic_payload_handler(RTPDynamicProtocolHandler *handler); +attribute_deprecated +void ff_register_rtp_dynamic_payload_handlers(void); +#endif +/** + * Iterate over all registered rtp dynamic protocol handlers. + * + * @param opaque a pointer where libavformat will store the iteration state. Must + * point to NULL to start the iteration. + * + * @return the next registered rtp dynamic protocol handler or NULL when the iteration is + * finished + */ +const RTPDynamicProtocolHandler *ff_rtp_handler_iterate(void **opaque); +/** + * Find a registered rtp dynamic protocol handler with the specified name. + * + * @param name name of the requested rtp dynamic protocol handler + * @return A rtp dynamic protocol handler if one was found, NULL otherwise. + */ RTPDynamicProtocolHandler *ff_rtp_handler_find_by_name(const char *name, enum AVMediaType codec_type); +/** + * Find a registered rtp dynamic protocol handler with a matching codec ID. + * + * @param id AVCodecID of the requested rtp dynamic protocol handler. + * @return A rtp dynamic protocol handler if one was found, NULL otherwise. + */ RTPDynamicProtocolHandler *ff_rtp_handler_find_by_id(int id, enum AVMediaType codec_type); @@ -209,8 +236,6 @@ int ff_parse_fmtp(AVFormatContext *s, PayloadContext *data, const char *attr, const char *value)); -void ff_register_rtp_dynamic_payload_handlers(void); - /** * Close the dynamic buffer and make a packet from it. */ diff --git a/libavformat/version.h b/libavformat/version.h index 5ced041..3b2a188 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -82,7 +82,9 @@ #ifndef FF_API_OLD_AVIO_EOF_0 #define FF_API_OLD_AVIO_EOF_0 (LIBAVFORMAT_VERSION_MAJOR < 59) #endif - +#ifndef FF_API_RTP_NEXT +#define FF_API_RTP_NEXT (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif #ifndef FF_API_R_FRAME_RATE #define FF_API_R_FRAME_RATE 1