Commit Graph

1482 Commits (mr8.5.9.3)

Author SHA1 Message Date
Richard Fuchs 79fb320021 add missing header include
7 years ago
Richard Fuchs 23977237c0 TT#61050 detect to-tag changes via via-branch
7 years ago
Razvan Crainea 8fb603e5c3 dtmf: prevent freeing json buf too early
7 years ago
Richard Fuchs f6f484fff6 TT#59501 add optional RTCP sink
7 years ago
Richard Fuchs 988d077b5c TT#60301 fix rtcp-mux logic with branched calls
7 years ago
Richard Fuchs fcb08df0ae TT#59805 add dtmf-log-dest option
7 years ago
Richard Fuchs 166aaa0c71 fix compilation for with_transcoding=no
7 years ago
Richard Fuchs f960799cdd TT#59703 add build test for dtmf_rx_fillin()
7 years ago
Richard Fuchs 7803930d21 TT#59703 generalise build test make macros
7 years ago
Richard Fuchs 7ad9906178 TT#59650 fix DTMF related core dump when repacketising
7 years ago
Richard Fuchs e17544a452 rate limit log lines resulting from strict-source drops
7 years ago
Richard Fuchs 910c03fa62 TT#58660 PCM to RFC DTMF transcoding
7 years ago
Richard Fuchs c0781e5193 TT#58659 RFC DTMF to PCM transcoding
7 years ago
Richard Fuchs 194c9e482f TT#58659 add optional encoder detour
7 years ago
Richard Fuchs db507468de TT#59100 support case insensitive codec names
7 years ago
Richard Fuchs 94f3c0eff7 TT#58659 remove redundant source PT definition
7 years ago
Richard Fuchs 2298de76b1 honour a=rtcp-fb in SDP even if transport is advertised as RTP/(S)AVP
7 years ago
Richard Fuchs 5acbf1ec87 TT#58659 always use the correct codec handler per packet
7 years ago
Richard Fuchs 985cd44c2b fix possible segfault after failed port alloc w/ iptables option
7 years ago
Richard Fuchs 77e31f1fb1 fix race condition after media player shutdown
7 years ago
Richard Fuchs c262956b6d Merge branch 'tcp_sockets_leak' of https://github.com/vitalikvoip/rtpengine
7 years ago
Vitalii Aleksandrov fe18043c0a Insert streambuf object to listener->streams before adding it to poller
7 years ago
Richard Fuchs 573cd3ff22 TT#58050 fix refcount bug
7 years ago
Richard Fuchs 582e645a98 fix missing recording_on flag set
7 years ago
Richard Fuchs 8eada4c03a TT#45617 document new log-mark-prefix/suffix options
7 years ago
Richard Fuchs 26b725d024 TT#45617 add new options to support log markers for sensitive data
7 years ago
Richard Fuchs 354f75490d TT#45617 add no-log-timestamps option
7 years ago
Richard Fuchs f01568ed95 fix compilation for older ffmpeg
7 years ago
Richard Fuchs d279789e23 silence warnings when compiling with -DNDEBUG
7 years ago
Richard Fuchs 357474df6f TT#50652 add label= option to match call participants
7 years ago
Richard Fuchs 9917e65599 fix division by zero for dtmf in some cases
7 years ago
Richard Fuchs fb76ef74f8 TT#54800 fix ptime overrides
7 years ago
Richard Fuchs dc9f99763a TT#54800 sequencing fixes
7 years ago
Richard Fuchs 40dc49f8e2 TT#50652 stop media playback on call delete
7 years ago
Richard Fuchs 661994e362 as per docs, remove all relay candidates under force-relay
7 years ago
Richard Fuchs 9eea6b1fc4 Reverse participant matching logic
7 years ago
Richard Fuchs 349954d2bc TT#50652 handle SRTP output for media playback
7 years ago
Richard Fuchs d449861d96 TT#50652 separate out and move crypt handler routines
7 years ago
Richard Fuchs e1825e3577 TT#50652 ensure consistent RTP timestamp across media restarts
7 years ago
Richard Fuchs 8d9a0d247c TT#50652 remove already enqueued packets when media is stopped
7 years ago
Richard Fuchs 7e85d1a935 TT#50652 keep existing SSRC context when starting another playback
7 years ago
Richard Fuchs 223996bc58 TT#50652 add documentation for media playback capability
7 years ago
Richard Fuchs 7f5e16d3da TT#50652 add stop_media call
7 years ago
Richard Fuchs 7da2b523a7 TT#50652 return media duration to SIP proxy in play_media response
7 years ago
Richard Fuchs e1e6fd4297 TT#50652 add explicit libav error reporting
7 years ago
Richard Fuchs 5b0a0105ef TT#50652 support playing back media files from database
7 years ago
Richard Fuchs 831946a8d4 TT#50652 fix compilation for with_transcode=no
7 years ago
Richard Fuchs 3bdad88063 TT#50652 create timer to gradually send packets without jitter
7 years ago
Richard Fuchs d639223bee TT#50652 add logging info to media_player timer runs
7 years ago
Richard Fuchs 8874b4a31f TT#50652 use random RTP TS when playing back media
7 years ago
Richard Fuchs 21535faea6 TT#50652 support playing back media from memory stream
7 years ago
Richard Fuchs 4aaccca6ee TT#50652 separate out media playback routine
7 years ago
Richard Fuchs 92b08d899c TT#50652 add media playback capability
7 years ago
Richard Fuchs 6ba60d5b54 TT#50652 split out packet dequeuing and sending function
7 years ago
Richard Fuchs 3374254899 TT#50652 split out codec payload type init function
7 years ago
Richard Fuchs 83965bdb1f TT#50652 infrastructure to support reading/playing of media files
7 years ago
Richard Fuchs d96dbdea17 TT#50652 split timer thread functions into separate file
7 years ago
Richard Fuchs cfe6f87c8d TT#50652 split timeval_cmp_ptr into function
7 years ago
Richard Fuchs 0cccae445f compile fix for with_transcoding=no
7 years ago
Richard Fuchs e3ec97f858 TT#50652 add -Wstrict-prototypes everywhere
7 years ago
Richard Fuchs 8f3c309c7f fix always-transcode not being honoured when only codec-mask was used
7 years ago
Richard Fuchs 6092c91ae4 TT#50652 fix possible sequencing bug while resampling
7 years ago
Guillem Jover 1f10dc30d5 TT#49106 Move the usage information into a new man page
7 years ago
Richard Fuchs da5cacc965 TT#50652 add YCM config for include/
7 years ago
Richard Fuchs ed5af2df00 TT#50652 add YCM helper macro for CSH hashing
7 years ago
Richard Fuchs 497c2d6a8d TT#49104 move RTP sequencing into SSRC context
7 years ago
Richard Fuchs 717021a29c add ssllib to gitignore
7 years ago
Richard Fuchs 3b28460507 TT#52651 Squashed commit of the following:
7 years ago
Alexey Vasilyev 0c9bb7c440 Rename crypto suits according to RFC6188
7 years ago
Richard Fuchs 4266f8e542 move SDES-no handling into __sdes_accept
7 years ago
Richard Fuchs 415af36ae6 don't add rtpmap or mid attributes for deleted/silenced streams
7 years ago
Richard Fuchs 0c559f5860 Add missing SDES accept routine
7 years ago
Richard Fuchs 5c556ef4cf don't abort on failed EPOLL_CTL_MOD
7 years ago
Richard Fuchs b593d57e21 TT#37400 do not answer with ICE attributes if no ICE was offered
7 years ago
Richard Fuchs e1d6c83319 ignore transcoding options in non-offer messages
7 years ago
Richard Fuchs 744d6a46ff add codec-set option
7 years ago
Richard Fuchs ee01f15852 fix non-default encoder bitrate not being applied
7 years ago
Richard Fuchs 0e129eda08 TT#49600 fix offered crypto suite not being dropped via SDES-no
7 years ago
Richard Fuchs c80f55b85a TT#49600 add debug log output for SDES negotiations
7 years ago
Richard Fuchs aaf8cbd525 TT#49350 eliminate stray scheduling warning
7 years ago
Guillem Jover 690bc91337 TT#49106 Fix typos
7 years ago
Richard Fuchs 9e4d140e7b TT#49045 add new flag to leave media direction attrs unchanged
7 years ago
Yasin CANER e8771d309d
daemon makefile : added if statement for g729
7 years ago
Richard Fuchs 881e0dc2dc TT#48800 add option to disable individual SDES crypto suites
7 years ago
Richard Fuchs 810bda1486 TT#48800 create codec hash tables only on demand
7 years ago
Richard Fuchs 98de5697e6 TT#48650 use constant string hashing for string lookups
7 years ago
Richard Fuchs 9e6199c7b9 don't skip incomplete monologues for `query`
7 years ago
Richard Fuchs c61d7f129e add new `full rtcp attribute` flag
7 years ago
Richard Fuchs 19da0e05e8 TT#45472 save and restore media IDs from and to redis
7 years ago
Richard Fuchs 3dc7d1b3ed TT#45472 support updating media ID strings
7 years ago
Richard Fuchs d39c2dbb43 TT#45472 properly accept support for trickle ICE
7 years ago
Richard Fuchs 77e2862a02 TT#45472 suppress media updates for SDP fragments
7 years ago
Richard Fuchs 18ec141d2b TT#45472 avoid an unnecessary implicit call to strlen
7 years ago
Richard Fuchs d08d84071a TT#45472 support SDP fragments for trickle ICE
7 years ago
Richard Fuchs 3603cda0c4 TT#45472 fix indentation
7 years ago
Richard Fuchs c546b6b89f TT#45472 check a=mid values in answers and warn on mismatches
7 years ago
Richard Fuchs e1fbe25b89 TT#45472 keep track of media IDs in a hash table
7 years ago
Richard Fuchs a1efdf6b20 TT#45472 support generating a=mid lines if not present
7 years ago
Richard Fuchs 3c50130c7b TT#45472 process and retain media ID strings (a=mid)
7 years ago
Richard Fuchs b778b712fc fix poller race condition
7 years ago
Richard Fuchs fb1083f8e3 Add option to leave base64 padding for a=crypto in place
7 years ago
Richard Fuchs 106007a36f Merge branch 'master' of https://github.com/HeroBase/rtpengine
7 years ago
Tor Petterson f71f66f60b Expanded Documentation of option log-srtp-keys
7 years ago
Richard Fuchs 0496c595b4
Change name of option from log-rtp-keys to log-srtp-keys
7 years ago
Richard Fuchs 0bf3eab4d6 convert codec ops to no-op for legacy control protocols
7 years ago
Richard Fuchs 13c21b1400 fix segfault when using legacy control protocol
7 years ago
Tor Petterson 590b752bbd Added option to write SRTP keys to log
7 years ago
Richard Fuchs e9f9ae75ad fix compiler warning
7 years ago
Richard Fuchs 347f1c68f9 suppress empty a=rtpmap lines
7 years ago
Richard Fuchs fc026cd7e4 fix possible null pointer dereference
7 years ago
Richard Fuchs 31023572a5 TT#41900 save monologue label into recording DB
7 years ago
Richard Fuchs 35764c5c63 TT#44702 add CLI command for interface/port stats
7 years ago
Richard Fuchs 326c6a5818 TT#43557 augment DTMF blocking to support directional blocking
7 years ago
Richard Fuchs 04a83027a0 TT#43557 implement media blocking
7 years ago
Guillem Jover 5ba52952c0 TT#42906 Add systemd notify support
8 years ago
Richard Fuchs 89084da8d8 TT#43855 support XMLRPC callback to Kamailio
8 years ago
Richard Fuchs e67b9c40da TT#43556 support blocking of DTMF event packets
8 years ago
Richard Fuchs b82cf56ec0 clean up code artefacts from cab9d895
8 years ago
Richard Fuchs cab9d895b2 TT#42500 fix only one crypto suite being offered.
8 years ago
Richard Fuchs 135dfb73ae fix handling of >1 consecutive media ports
8 years ago
Richard Fuchs 7dd8ed0b8f quote options value strings in error output
8 years ago
Richard Fuchs d4afb14e11 fix DTMF packet allocation size
8 years ago
Richard Fuchs a44b34a7a9 don't free event base before calling loopbreak()
8 years ago
Eric Green f91b64fcdf Make recording more accurately report source address. Fixes #584
8 years ago
Richard Fuchs 694e9d8f60 do not memcmp against uninitialized bytes
8 years ago
Richard Fuchs 0aeb06f613 TT#40900 store metadata in call struct instead of recording struct
8 years ago
Richard Fuchs 178391e177 fix possible core dump when processing certain malformed SDP
8 years ago
Richard Fuchs d26b11ffb0 fix compilation for with_transcoding=no
8 years ago
Richard Fuchs be9c3146f4 fix missing header include
8 years ago
Richard Fuchs 08fc00906d fix segfault with DTMF logging and implicit payload types
8 years ago
Richard Fuchs a9ec666cb4 TT#38350 implement sending DTMF events to syslog
8 years ago
Richard Fuchs dd34574669 TT#38350 keep track of the most used RTP payload type
8 years ago
Richard Fuchs 4eb80da836 compile fix for with_transcoding=no option
8 years ago
Richard Fuchs d66a2e5191 TT#38351 support specifying interfaces by name
8 years ago
Richard Fuchs cbe7e5ab1d TT#36700 implement ports free list
8 years ago
Richard Fuchs bfac341aec shut down transcoding engine when it's not needed
8 years ago
Richard Fuchs 8562bdee70 support new `asymmetric codecs` flag
8 years ago
Richard Fuchs f1b81b649e simplify parameters passed to codec_rtp_payload_types()
8 years ago
Richard Fuchs 9f3f24f3ef TT#36759 rate limiting for ICE/STUN log messages
8 years ago
Richard Fuchs e404f18975 TT#37157 fix missing G722 RTP TS output scaling
8 years ago
Richard Fuchs 50394e8dd2 TT#37156 fix divide by zero error (regression from db58aa80)
8 years ago
Huseyin Dikme 30ba1cd2a6 control command logs have been updated
8 years ago
Richard Fuchs 95a7cc6cfb eliminate redundant function argument
8 years ago
Richard Fuchs d64c888a0e TT#36301 transcoding unit tests
8 years ago
Richard Fuchs 2f5d792aae TT#36301 add `always-transcode` flag
8 years ago
Richard Fuchs 5c3d39748b TT#35456 fix regression from 895fa9605
8 years ago
Richard Fuchs 7de16e104c TT#14008 fix codec mask logic if no masking info is present
8 years ago
Richard Fuchs fb75ef748a TT#14008 fix libpcre references in makefile
8 years ago
Richard Fuchs db58aa80d0 fix graphite interval calculation for call durations
8 years ago
Richard Fuchs 09fed75e7e Merge branch 'master' of https://github.com/hdikme/rtpengine
8 years ago
Richard Fuchs fa5c265045 TT#36302 support scheduling settings
8 years ago
Richard Fuchs 14ffd8feb0 TT#36303 support bandwidth usage resource limit
8 years ago
Richard Fuchs 6da7494a08 TT#36180 calculate per-second stats based on timer runtime
8 years ago
Huseyin Dikme ab58245096 -cli params diff command has been updated to serve only for the
8 years ago
Richard Fuchs 9943a3d868 TT#36180 scale timer interval according to runtimes
8 years ago
Richard Fuchs 3b3e964c83 short lock duration for faster calls iteration in the timer
8 years ago
Richard Fuchs 539e063992 don't retry XMLRPC callback if endpoint says the ID was not found
8 years ago
Richard Fuchs 68e8092098 add ../include to YCM config
8 years ago
Richard Fuchs 2c5a358e1c TT#36308 fix possible segfault due to missing lock
8 years ago
Lucian Balaceanu 83911675cd Fix for recovering from losing synchronous redis context while the async one is up
8 years ago
Richard Fuchs db2882ca78 integrate AES unit test into main build framework
8 years ago
Richard Fuchs 8c770b9e05 appropriate use of LDFLAGS and LDLIBS
8 years ago
Richard Fuchs b4f65bdd96 TT#35634 add `xmlrpc-address` option for callback address
8 years ago
Richard Fuchs 345836e90a TT#35413 implement a CPU limit and a load limit
8 years ago
Richard Fuchs efcad1c628 TT#35413 add support for the 'load limit' ng protocol extension
8 years ago
Richard Fuchs 43f2971722 disallow zero interface addresses in config
8 years ago
Richard Fuchs e0cdf74ac5 fix SRTP ROC syncing between kernel and userspace
8 years ago
Richard Fuchs 895fa96054 TT#35456 implement RFC 4867
8 years ago
Richard Fuchs 761ac6cb4f errno must be set to 0 before calling strto*()
8 years ago
Richard Fuchs 6fa712d0d8 implement offer-timeout option
8 years ago
Richard Fuchs bf66d7caf7 eliminate stray glib warning
8 years ago
Anthony Alba b9d84aa993 recording.c: add a few ms timestamps to pcap metadata
8 years ago
Jerzy Ptak a44a9bf9f0 fixing memory leaks
8 years ago
Richard Fuchs 79a74f69ff Merge branch 'redis_racecondition' of https://github.com/1and1/rtpengine
8 years ago
Claudiu Boriga 229b78d2b8 Fix race condition where redis context is used outside mutex protection
8 years ago
Richard Fuchs 33b262af78 TT#33700 migrate from avresample to swresample
8 years ago
Richard Fuchs ce44eaf1d3 fix RTP timestamps in G.729 decoder
8 years ago
Richard Fuchs 16024d2e7a create explicit per-stream DTLS context for ICE
8 years ago
Richard Fuchs 5a73f12adb TT#34050 replace ffmpeg version test macro
8 years ago
Richard Fuchs 14100b0b8a use reference counting on SSRC objects
8 years ago
Richard Fuchs a3ed739835 Merge branch 'fix_uptime_stats' of https://github.com/1and1/rtpengine
8 years ago
Claudiu Boriga 6ee4cc3a8d Fix uptime statistics
8 years ago
Richard Fuchs 4be4f13ce0 Merge branch 'add-label' of https://github.com/aalba6675/rtpengine
8 years ago
Anthony Alba bbcea40415 recording.c: save the label in pcap metadata file
8 years ago
Richard Fuchs 2fc2b3bab7 fix possible null pointer segfault when using log level 7
8 years ago
Richard Fuchs e4e79233e2 compilation fix for glib < 2.32 (CentOS 6)
8 years ago
Richard Fuchs 6e8d57e528 honour RFC 5506 by allowing more RTCP packet types leading the group
8 years ago
Richard Fuchs 32e0e2cf25 leave room for SRTP auth tag on transcoded packets
8 years ago
Richard Fuchs 620cf6125a version test macro for DTLS_set_link_mtu
8 years ago
Richard Fuchs 0db5e226e5 fix payload type tracking for transcoding situations
8 years ago
Richard Fuchs 092f8da3c6 use str_token_sep for SDP token extraction
8 years ago
Richard Fuchs 3aa53a1e10 fix missing setup_media when using start_recording call
8 years ago
Richard Fuchs 5b0bb90afa fix recording setup_media reversed direction
8 years ago
Richard Fuchs 3885da946b workaround for buggy OpenSSL that produces incorrectly fragmented DTLS
8 years ago
Richard Fuchs 65c75c5177 fix segfault regression from 7b65dedb
8 years ago
Richard Fuchs 7ee73fe7f9 special handling for strip=all together with transcode, and mask=all
8 years ago
Richard Fuchs 14262f56fa fix segfault regression from e84fd86
8 years ago
Richard Fuchs 7b65dedb95 restructure codec_make_payload_type to fix compilation w/o transcoding
8 years ago
Richard Fuchs 4d586f2ec0 TT#28163 fix recording-daemon sample format selection for mixed output
8 years ago
Richard Fuchs 165cb0cd4b Merge branch 'extend-default-intf' of https://github.com/1and1/rtpengine
8 years ago
Richard Fuchs e84fd8612b fix incorrect DTLS context being used with ICE
8 years ago
Richard Fuchs bc30929192 TT#32210 add codec masking option
8 years ago
Richard Fuchs 60ce21245e TT#28163 use a pointer cache to avoid hash table lookup
8 years ago
Richard Fuchs 9147d5e438 TT#32983 support transcoding options in redis (re)store
8 years ago
Richard Fuchs 4d859bfd6b TT#28163 add support for properly packaged libbcg729
8 years ago
Richard Fuchs 65d4106d98 add missing header files to fix compilation
8 years ago
Claudiu Boriga e8b40191fe Enable round robin for default interface
8 years ago
Richard Fuchs 3fa94d7f57 TT#31197 document bcg729 requirements
8 years ago
Richard Fuchs 25037a92ac TT#31197 G.729 packetizer
8 years ago
Richard Fuchs 9eb9a2f421 TT#31197 include bcg729 build support
8 years ago
Richard Fuchs 83784d492c TT#31197 separate out libavcodec specifics
8 years ago
Richard Fuchs 61d5505740 TT#31199 set bitrate for G.723.1
8 years ago
Richard Fuchs 0636b083dc TT#31700 implement payload-type specific passthrough kernel forwarding
8 years ago
Richard Fuchs 126a69f29c TT#28163 logging and documentation improvements
8 years ago
Richard Fuchs 10c852b204 TT#31950 add compile-time switch to disable transcoding features
8 years ago
Richard Fuchs 2a4acf5e29 TT#31403 handle passthrough payloads in a transcoding context
8 years ago
Richard Fuchs 6988b2361e TT#31403 keep track of stats required for RTCP translation/output
8 years ago
Richard Fuchs 613f7afdb6 TT#31403 map and replace RTCP SSRCs when transcoding
8 years ago
Richard Fuchs 26a356ccae TT#31403 eliminate stub RTCP handler functions
8 years ago
Richard Fuchs 5d67605535 TT#31403 decouple RTCP AVPF filtering from crypto stuff
8 years ago
Richard Fuchs 368312a4f5 TT#31403 keep local packet stats for RTCP output/rewriting
8 years ago
Richard Fuchs 159729ad0d TT#31403 move SSRC mapping out of codec handler
8 years ago
Richard Fuchs 7986ca0860 TT#30900 support specifying codec parameters for transcoding
8 years ago
Richard Fuchs a4a0e34ded TT#31408 distinguish between codec types
8 years ago
Richard Fuchs 2e43b47305 TT#31409 check codec support only once during startup
8 years ago
Richard Fuchs 71b3762f13 TT#30901 use hash table to look up RFC specified codecs
8 years ago
Richard Fuchs ff0a46a053 TT#30901 convert codec list to hash table
8 years ago
Richard Fuchs 266a1fbc8b TT#31404 support custom ptime and repacketization for sampled codecs
8 years ago
Richard Fuchs c380052882 TT#31401 configure encoder bitrate
8 years ago
Richard Fuchs c6c79f49b8 TT#31198 flush encoder queue on shutdown to avoid warnings
8 years ago
Richard Fuchs 1746f1d3bf TT#31405 handle non-media pseudo-codecs (telephone-event)
8 years ago
Richard Fuchs ad4a5d10ef TT#31198 add resampling support
8 years ago
Richard Fuchs 2d2f2e394b TT#31198 support output codec clockrate multiplier (for G722)
8 years ago
Richard Fuchs 7c6db89889 TT#28163 don't reset transcoding context when not necessary
8 years ago
Richard Fuchs 14c3cd8ab1 TT#28163 support transcoding to non-RFC codecs
8 years ago
Richard Fuchs 55007a6897 TT#28163 prevent kernelization of transcoded stream
8 years ago
Richard Fuchs b0bc679806 TT#28163 take number of channels from SDP into account
8 years ago
Richard Fuchs df537b98c3 TT#28163 pass encoded packets back to processing for sending out
8 years ago
Richard Fuchs dc80c27af7 TT#28163 split encoder from recording daemon into shared lib
8 years ago
Richard Fuchs a4e73c90e8 TT#30404 accept and reject codecs according to transcoding preference
8 years ago
Richard Fuchs cee94a5348 TT#28163 pass RTP packets to media decoder
8 years ago
Richard Fuchs b9206a49bc TT#28163 abstractize SSRC hash
8 years ago
Richard Fuchs f8aad04948 TT#30404 move portions required for decoding from recording-daemon to lib
8 years ago
Richard Fuchs d510f5efe8 TT#30404 initial support for adding codecs for transcoding
8 years ago
Richard Fuchs f801240164 TT#30570 replace "chopper" iovec with GString
8 years ago
Richard Fuchs c3585b04be TT#30405 reprint a=rtpmap and a=fmtp for SDP output
8 years ago
Richard Fuchs 8715d40242 TT#30405 codec matchup and handler functions
8 years ago
Richard Fuchs fb729e3d12 TT#30405 create a packet handling context struct for convenience
8 years ago
Richard Fuchs bc420cbdd0 TT#30405 split stream_packet() into smaller pieces
8 years ago
Claudiu Boriga 80abad18cf Merge remote-tracking branch 'sipwise/master' into extend-rtpengine-ctl
8 years ago