Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

smoothstreaming audio retrieval failed after 6 secondes #19

Closed
DarkAnakin opened this issue Apr 3, 2017 · 18 comments
Closed

smoothstreaming audio retrieval failed after 6 secondes #19

DarkAnakin opened this issue Apr 3, 2017 · 18 comments

Comments

@DarkAnakin
Copy link

DarkAnakin commented Apr 3, 2017

Hi

For some channels audio stop working after some secondes while video still keep working.
I think it will be better to ask now before I dig on the source code to try to find out why, that I know will take me some days.

In the archives below you will find the kodi.log and the manifest file parsed by kodi.
Search for "code 404" to get right away the error or either "vf=" or "vo=" to get the audios fragments downloaded by curl.

1st log with only one audio stream
logs_vf.zip

2nd log with 2 audio streams, vf stream select by default. This audio stream doesn't failed.
After some time a switch to vo stream and it failed.

logs_vf_vo.zip

3rd log with 2 audio streams, vo stream select by default. The audio stream failed after some secondes.
Switch to vf works but video stream "pause" while audio stream tried to catch the time difference.

logs_vo_vf.zip

Where is timeshifting is implemented? inputstream addon side or my client side? Because for some channels I have 8 hours of timeshift but kodi don't allow me to pause neither to go back in time.

I am use the agile branch for kodi and for inputstream.adaptive cause only with this one ffmepg can't decrypt the streams.
Thanks

Edit1:
After quick 1st log review, it seems that the timestamp request is wrong. if duration have some patterns, it should be 1211745612061910 instead of 1211745592221914. For what I have seen with exoplayer, they redownload the manifest and update corresponding variables.
I start to implement this but it seems it will need more works than just redownload the manifest and update some variables. I have to understand what going on and It will surely take me some time.
So if you can't implement it or point me the rigth way to do it, it will be wonderful.

Edit2:
Updating durations with refreshing manifest seems the best way to do it but I will maybe need to modified more codes than I would like to. So I have a function that find the durations pattern and append it to segment_durations
in AdaptiveTree::SetFragmentDuration(). The timestamp request sequence seems right but I get an CVideoPlayerAudio - CDVDMsg::GENERAL_EOF this time.You will find the logs and the function in this archive
logs_edit_pattern.zip
_

@peak3d
Copy link
Contributor

peak3d commented Apr 5, 2017

I have to dig into your zip examples / logs. From theory reloading manifests should not be needed as the length of the fragments is always present. But this is theory (and worked at some time at least for the live streams I was playing with. redownloading manifest files feels for me kind of "fixing something broken" I'll look into the logs you provided

  • timeshift is not implemented, kodi still has no proper interface to pass timeshift infos and therefore I postponed it. I start now-12 secs and tel kodi that stream ist not seekable and not pausable.

Edit: before thinking about redownloading manifest files we should more look why we calculate the wrong fragment duration of the last segment played. the 1211745592221914 seems to be a calculated value and seems to be not correct. Its much easier to find the root cause instead thinking about redownloading anything.

@DarkAnakin
Copy link
Author

I don't fully understand your code and the smoothstreaming protocol so I take some shortcuts that maybe wrong. I was thinking that the manifest refresh was the best choice because maybe in some time the pattern will change. The right value for 1211745592221914 is not what I said before, it 1211745592221920. You will find a spreadsheet for the timestamp calculation for the logs_edit_pattern here
smooth_duration.xlsx

I will try, maybe today, to append the calculate durations just after the manifest parsing and go back before the 12 secs and see if it wiil work for me.
I think maybe the back-end have to do with this issue because with some channel I haven't this. Maybe It will return the fragment in between even if the timestamp was not right.

What I have done for adding duration:
search for pattern after each end of chunck attribute

 else if (strcmp(el, "c") == 0)
 {
/***
**/
  findPatterns(dash->current_adaptationset_);
}

and insert a amount of duration pattern in the end when segment_durations_.data come to end:

uint32_t patternSize = adp->durationPattern.size();
uint k = adp->segment_durations_.data.size()%patternSize;
/***
**/
uint ek = k+patternSize;
 for (;k<ek;k++){
   uint32_t val  =adp->durationPattern.at(k%patternSize);
   adpm->segment_durations_.data.insert(adpm->segment_durations_.data.end(),val);
/**
**/
}

Not the best way to resolve this issue without access to the stream but I am a bit obsessed about my private data. I will try to secure my setup and will try to find a way to send the streams.

@peak3d
Copy link
Contributor

peak3d commented Apr 6, 2017

for me there exist one golden rule: don't write a single line of code before you don't know 100% what you want to archive. E.g. skygo livestreams don't redownoad the manifest, because simply adding the duration of played fragments should point you to the right pattern.

You know the starting timestamp of the first fragment wich is not in ism file: its the the last ts + duration.
If you now download this new fragment, and look with bento4 into it, you should get the exact duration of this next fragment and can simply append your ism manifest file. From theory this should be continuable in an endless loop.

You can log here: https://github.com/peak3d/inputstream.adaptive/blob/master/src/common/AdaptiveTree.cpp#L102

what happens, I guess that your issue is simply a inaccuraty when dealing with the timescale values.
log fragmentduration before / after the convertion and verify the values. If the incoming value is already wrong, then we have to look deeper in bento4 why the duration is 6 smaller than expected.

@DarkAnakin
Copy link
Author

DarkAnakin commented Apr 6, 2017 via email

@peak3d
Copy link
Contributor

peak3d commented Apr 6, 2017

Maybe I simply don't understand what you're exactly doing, from my POV we simply have to find the root cause: Why is the fragment duration of the first fragment read behind the fragments defined in manifest some millisecs shorter than the expected value.

Why adding some value at the end or trying to get something working if there is an reproducable issue?
Why not simply investigate the cause of the error? Finding ways to "not having" the issue is IMO not the way how to solve this one.

Edit: can you pls. log the fragment-duration here: ?
https://github.com/peak3d/inputstream.adaptive/blob/master/src/main.cpp#L1319
This must be for the first 6 fragments played the same values you find at the end of the ism manifest.

@DarkAnakin
Copy link
Author

DarkAnakin commented Apr 6, 2017

Ok, I think I get what you tried to say now. I didn't what to edit anything that I couldn't understand and editing the calculation with the movie_timescale may had break something else so I didn't point any attention to it.
I will try to provide you the logs this afternoon or maybe to night.

Edit1:
Search for "SetFragmentDuration" e.g last duration 19840001 * timescale 10000000 / movietimescale 10000000 => 19840001 mean that last duration before the calculation was 19840001 and the result is => 19840001.
I can't understand why 19840001 has been chosen so I think It will be you to have to come with a response. Dig in to bento4 sources don't give me any clue.
As for append duration just after the manifest work for me at least, I will stay with this for now and try to understand the fragment duration calculation this week-end.
setfragduration_logs.zip

@peak3d
Copy link
Contributor

peak3d commented Apr 6, 2017

In general the fragment duration is simply the sum of all frames * frame_duration.
What Bento4 calculates should be exactly the same as in ism,
-> 19840001 looks not really good

Edit: The first duration is already not ok: 20053334

Tipp: Select "Media" = Audio in inputstream.adaptive settings.
Its much easier to read log and debug.

Edit2:
https://github.com/peak3d/inputstream.adaptive/blob/master/lib/libbento4/Core/Ap4FragmentSampleTable.cpp#L189 <-- Here a sample gets its duration

https://github.com/peak3d/inputstream.adaptive/blob/master/lib/libbento4/Core/Ap4FragmentSampleTable.cpp#L228 <-- Here the fragment duration is summed.

Interesting is line 189, is default_duration taken or does every sample has its own duration.

After the loop you have your fragment duration (and this is the place where 19840001 was calculated)

@peak3d
Copy link
Contributor

peak3d commented Apr 6, 2017

Can you pls download one audio fragment if you are again coding?
Just grep one line from log and wget / curl it. thanx!

@DarkAnakin
Copy link
Author

Any audio fragment?
I presume you what me to upload it too. So here is.

vo=1214513785459420.zip

@peak3d
Copy link
Contributor

peak3d commented Apr 6, 2017

Ok, thanx, looking into the MP4 Box the duration of this fragment is:

20053332

I have a feeling that their spltting program always rounds to full 10 values.
maybe its a definition

You can try to round the fragment-duration for test here:

https://github.com/peak3d/inputstream.adaptive/blob/master/src/common/AdaptiveTree.cpp#L102

Below this line ^^ pls. add: fragmentDuration = ((fragmentDuration +9) / 10) * 10;

@DarkAnakin
Copy link
Author

DarkAnakin commented Apr 6, 2017 via email

@peak3d
Copy link
Contributor

peak3d commented Apr 6, 2017

It's an integer division assume dur=5:

(5 +9) = 14/10 = 1;
1*10 = 10;

Edit: Goal is to have all durations dividable through 10, you can also use modulo for it, I don't care.
If you look at the ism manifest, you my have noticed that all values are ending with 0.

@peak3d
Copy link
Contributor

peak3d commented Apr 6, 2017

https://forums.iis.net/p/1167897/1944371.aspx#1944371

Interesting article to get the value we're looking for on an other way

@DarkAnakin
Copy link
Author

DarkAnakin commented Apr 6, 2017 via email

@peak3d
Copy link
Contributor

peak3d commented Apr 6, 2017

You can test with the round, it will most probably work for your example but it is not a proper way.
I'll implement the UUID thing (its existng in your sample stream) but you'll have to test it

@peak3d
Copy link
Contributor

peak3d commented Apr 7, 2017

The latest commit could / should solve the issue

@DarkAnakin
Copy link
Author

Thanks a lot. It solved. Keep up the good work.

@peak3d
Copy link
Contributor

peak3d commented Apr 7, 2017

thanx for feedback!

@peak3d peak3d closed this as completed Apr 7, 2017
dobo90 added a commit to dobo90/inputstream.adaptive that referenced this issue Feb 8, 2023
* Add sleep inside AdaptiveTree.cpp to trigger the issue

From Kodi logs:

2023-02-08 18:02:11.679 T:22020    info <general>: Creating InputStream
2023-02-08 18:02:11.691 T:22020    info <general>: AddOnLog: inputstream.adaptive: [Repr. chooser] Resolution set: 4096x2304, max allowed: 8152x4436, Adjust refresh rate: 0
2023-02-08 18:02:11.989 T:22020    info <general>: AddOnLog: inputstream.adaptive: Successfully parsed manifest file (Periods: 1, Streams in first period: 2, Type: live)
2023-02-08 18:02:12.989 T:22024   error <general>: AddOnLog: inputstream.adaptive: SegmentUpdateWorker: DEBUG before RefreshLiveSegments()
2023-02-08 18:02:13.028 T:22020    info <general>: Creating Demuxer
2023-02-08 18:02:13.029 T:22020    info <general>: Opening stream: 1006 source: 256
2023-02-08 18:02:13.114 T:22024   error <general>: AddOnLog: inputstream.adaptive: SegmentUpdateWorker: DEBUG after RefreshLiveSegments()
2023-02-08 18:02:13.160 T:22020   error <general>: AddOnLog: inputstream.adaptive: DEBUG before sleep()
2023-02-08 18:02:14.114 T:22024   error <general>: AddOnLog: inputstream.adaptive: SegmentUpdateWorker: DEBUG before RefreshLiveSegments()
2023-02-08 18:02:14.135 T:22024   error <general>: AddOnLog: inputstream.adaptive: SegmentUpdateWorker: DEBUG after RefreshLiveSegments()
2023-02-08 18:02:15.135 T:22024   error <general>: AddOnLog: inputstream.adaptive: SegmentUpdateWorker: DEBUG before RefreshLiveSegments()
2023-02-08 18:02:15.155 T:22024   error <general>: AddOnLog: inputstream.adaptive: SegmentUpdateWorker: DEBUG after RefreshLiveSegments()
2023-02-08 18:02:16.155 T:22024   error <general>: AddOnLog: inputstream.adaptive: SegmentUpdateWorker: DEBUG before RefreshLiveSegments()
2023-02-08 18:02:16.161 T:22020   error <general>: AddOnLog: inputstream.adaptive: DEBUG after sleep()

Address sanitizer report:

==21945==ERROR: AddressSanitizer: heap-use-after-free on address 0x7f402596e960 at pc 0x7f40131c4944 bp 0x7f402616de50 sp 0x7f402616de40
READ of size 8 at 0x7f402596e960 thread T53
    #0 0x7f40131c4943 in adaptive::AdaptiveStream::start_stream() /home/dobo/kodi/inputstream.adaptive/src/common/AdaptiveStream.cpp:610
    xbmc#1 0x7f4013178317 in CInputStreamAdaptive::OpenStream(int) /home/dobo/kodi/inputstream.adaptive/src/main.cpp:309
    xbmc#2 0x7f4013187f07 in kodi::addon::CInstanceInputStream::ADDON_OpenStream(AddonInstance_InputStream const*, int) (/usr/lib/kodi/addons/inputstream.adaptive/inputstream.adaptive.so.20.3.2+0x387f07)
    xbmc#3 0x55abad48474b in CDVDDemuxClient::OpenStream(int) (/usr/lib/kodi/kodi.bin+0xb7c74b)
    xbmc#4 0x55abad508385 in CVideoPlayer::OpenStream(CCurrentStream&, long, int, int, bool) (/usr/lib/kodi/kodi.bin+0xc00385)
    xbmc#5 0x55abad508bba in CVideoPlayer::OpenDefaultStreams(bool) (/usr/lib/kodi/kodi.bin+0xc00bba)
    xbmc#6 0x55abad50a857 in CVideoPlayer::Prepare() (/usr/lib/kodi/kodi.bin+0xc02857)
    xbmc#7 0x55abad510d45 in CVideoPlayer::Process() (/usr/lib/kodi/kodi.bin+0xc08d45)
    xbmc#8 0x55abad758396 in CThread::Action() (/usr/lib/kodi/kodi.bin+0xe50396)
    xbmc#9 0x55abae0f0e24  (/usr/lib/kodi/kodi.bin+0x17e8e24)
    xbmc#10 0x55abad755dba  (/usr/lib/kodi/kodi.bin+0xe4ddba)
    xbmc#11 0x7f403d4d72c2 in execute_native_thread_routine /usr/src/debug/gcc/gcc/libstdc++-v3/src/c++11/thread.cc:82
    xbmc#12 0x7f403dd8cbb4  (/usr/lib/libc.so.6+0x85bb4)
    xbmc#13 0x7f403de0ed8f  (/usr/lib/libc.so.6+0x107d8f)

0x7f402596e960 is located 303456 bytes inside of 303840-byte region [0x7f4025924800,0x7f402596eae0)
freed by thread T57 here:
    #0 0x7f403fac178a in operator delete(void*, unsigned long) /usr/src/debug/gcc/gcc/libsanitizer/asan/asan_new_delete.cpp:164
    xbmc#1 0x7f40131de17d in std::__new_allocator<adaptive::AdaptiveTree::Segment>::deallocate(adaptive::AdaptiveTree::Segment*, unsigned long) /usr/include/c++/12.2.1/bits/new_allocator.h:158
    xbmc#2 0x7f40131d974a in std::allocator_traits<std::allocator<adaptive::AdaptiveTree::Segment> >::deallocate(std::allocator<adaptive::AdaptiveTree::Segment>&, adaptive::AdaptiveTree::Segment*, unsigned long) /usr/include/c++/12.2.1/bits/alloc_traits.h:496
    xbmc#3 0x7f40131d33cb in std::_Vector_base<adaptive::AdaptiveTree::Segment, std::allocator<adaptive::AdaptiveTree::Segment> >::_M_deallocate(adaptive::AdaptiveTree::Segment*, unsigned long) /usr/include/c++/12.2.1/bits/stl_vector.h:387
    xbmc#4 0x7f40131edabd in std::_Vector_base<adaptive::AdaptiveTree::Segment, std::allocator<adaptive::AdaptiveTree::Segment> >::~_Vector_base() /usr/include/c++/12.2.1/bits/stl_vector.h:366
    xbmc#5 0x7f40131edb57 in std::vector<adaptive::AdaptiveTree::Segment, std::allocator<adaptive::AdaptiveTree::Segment> >::~vector() /usr/include/c++/12.2.1/bits/stl_vector.h:733
    xbmc#6 0x7f40131ea67f in adaptive::SPINCACHE<adaptive::AdaptiveTree::Segment>::~SPINCACHE() /home/dobo/kodi/inputstream.adaptive/src/common/AdaptiveTree.h:44
    xbmc#7 0x7f40131eae13 in adaptive::AdaptiveTree::Representation::~Representation() /home/dobo/kodi/inputstream.adaptive/src/common/AdaptiveTree.h:208
    xbmc#8 0x7f40131eb5c2 in adaptive::AdaptiveTree::AdaptationSet::~AdaptationSet() /home/dobo/kodi/inputstream.adaptive/src/parser/../common/AdaptiveTree.h:326
    xbmc#9 0x7f40131ecef6 in adaptive::AdaptiveTree::Period::~Period() /home/dobo/kodi/inputstream.adaptive/src/parser/../common/AdaptiveTree.h:462
    xbmc#10 0x7f40131e19ef in adaptive::AdaptiveTree::~AdaptiveTree() /home/dobo/kodi/inputstream.adaptive/src/common/AdaptiveTree.cpp:92
    xbmc#11 0x7f401323f6a4 in adaptive::DASHTree::~DASHTree() /home/dobo/kodi/inputstream.adaptive/src/parser/DASHTree.h:16
    xbmc#12 0x7f401323f6bf in adaptive::DASHTree::~DASHTree() /home/dobo/kodi/inputstream.adaptive/src/parser/DASHTree.h:16
    xbmc#13 0x7f401323f73c in std::default_delete<adaptive::DASHTree>::operator()(adaptive::DASHTree*) const /usr/include/c++/12.2.1/bits/unique_ptr.h:95
    xbmc#14 0x7f401323c926 in std::unique_ptr<adaptive::DASHTree, std::default_delete<adaptive::DASHTree> >::~unique_ptr() /usr/include/c++/12.2.1/bits/unique_ptr.h:396
    xbmc#15 0x7f4013237aa8 in adaptive::DASHTree::RefreshLiveSegments() /home/dobo/kodi/inputstream.adaptive/src/parser/DASHTree.cpp:1962
    xbmc#16 0x7f40131e7842 in adaptive::AdaptiveTree::SegmentUpdateWorker() /home/dobo/kodi/inputstream.adaptive/src/common/AdaptiveTree.cpp:431
    xbmc#17 0x7f4013208eea in void std::__invoke_impl<void, void (adaptive::AdaptiveTree::*)(), adaptive::AdaptiveTree*>(std::__invoke_memfun_deref, void (adaptive::AdaptiveTree::*&&)(), adaptive::AdaptiveTree*&&) /usr/include/c++/12.2.1/bits/invoke.h:74
    xbmc#18 0x7f4013208d56 in std::__invoke_result<void (adaptive::AdaptiveTree::*)(), adaptive::AdaptiveTree*>::type std::__invoke<void (adaptive::AdaptiveTree::*)(), adaptive::AdaptiveTree*>(void (adaptive::AdaptiveTree::*&&)(), adaptive::AdaptiveTree*&&) /usr/include/c++/12.2.1/bits/invoke.h:96
    xbmc#19 0x7f4013208cc6 in void std::thread::_Invoker<std::tuple<void (adaptive::AdaptiveTree::*)(), adaptive::AdaptiveTree*> >::_M_invoke<0ul, 1ul>(std::_Index_tuple<0ul, 1ul>) /usr/include/c++/12.2.1/bits/std_thread.h:258
    xbmc#20 0x7f4013208c7f in std::thread::_Invoker<std::tuple<void (adaptive::AdaptiveTree::*)(), adaptive::AdaptiveTree*> >::operator()() /usr/include/c++/12.2.1/bits/std_thread.h:265
    xbmc#21 0x7f4013208c63 in std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (adaptive::AdaptiveTree::*)(), adaptive::AdaptiveTree*> > >::_M_run() /usr/include/c++/12.2.1/bits/std_thread.h:210
    xbmc#22 0x7f403d4d72c2 in execute_native_thread_routine /usr/src/debug/gcc/gcc/libstdc++-v3/src/c++11/thread.cc:82

previously allocated by thread T53 here:
    #0 0x7f403fac0672 in operator new(unsigned long) /usr/src/debug/gcc/gcc/libsanitizer/asan/asan_new_delete.cpp:95
    xbmc#1 0x7f40131deab1 in std::__new_allocator<adaptive::AdaptiveTree::Segment>::allocate(unsigned long, void const*) /usr/include/c++/12.2.1/bits/new_allocator.h:137
    xbmc#2 0x7f40131db727 in std::allocator_traits<std::allocator<adaptive::AdaptiveTree::Segment> >::allocate(std::allocator<adaptive::AdaptiveTree::Segment>&, unsigned long) /usr/include/c++/12.2.1/bits/alloc_traits.h:464
    xbmc#3 0x7f40131d5b81 in std::_Vector_base<adaptive::AdaptiveTree::Segment, std::allocator<adaptive::AdaptiveTree::Segment> >::_M_allocate(unsigned long) /usr/include/c++/12.2.1/bits/stl_vector.h:378
    xbmc#4 0x7f40131d1308 in std::vector<adaptive::AdaptiveTree::Segment, std::allocator<adaptive::AdaptiveTree::Segment> >::reserve(unsigned long) /usr/include/c++/12.2.1/bits/vector.tcc:79
    xbmc#5 0x7f401322dd61 in end /home/dobo/kodi/inputstream.adaptive/src/parser/DASHTree.cpp:1253
    xbmc#6 0x7f403c4d8263  (/usr/lib/libexpat.so.1+0xd263)

Thread T53 created by T0 here:
    #0 0x7f403fa64207 in __interceptor_pthread_create /usr/src/debug/gcc/gcc/libsanitizer/asan/asan_interceptors.cpp:207
    xbmc#1 0x7f403d4d73a9 in __gthread_create /usr/src/debug/gcc/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/x86_64-pc-linux-gnu/bits/gthr-default.h:663
    xbmc#2 0x7f403d4d73a9 in std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) /usr/src/debug/gcc/gcc/libstdc++-v3/src/c++11/thread.cc:147

Thread T57 created by T53 here:
    #0 0x7f403fa64207 in __interceptor_pthread_create /usr/src/debug/gcc/gcc/libsanitizer/asan/asan_interceptors.cpp:207
    xbmc#1 0x7f403d4d73a9 in __gthread_create /usr/src/debug/gcc/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/x86_64-pc-linux-gnu/bits/gthr-default.h:663
    xbmc#2 0x7f403d4d73a9 in std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) /usr/src/debug/gcc/gcc/libstdc++-v3/src/c++11/thread.cc:147
    xbmc#3 0x7f40131e751e in adaptive::AdaptiveTree::StartUpdateThread() /home/dobo/kodi/inputstream.adaptive/src/common/AdaptiveTree.cpp:418
    xbmc#4 0x7f401323398d in adaptive::DASHTree::open(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >) /home/dobo/kodi/inputstream.adaptive/src/parser/DASHTree.cpp:1639
    xbmc#5 0x7f401328c8ed in SESSION::CSession::Initialize() /home/dobo/kodi/inputstream.adaptive/src/Session.cpp:248
    xbmc#6 0x7f4013175f30 in CInputStreamAdaptive::Open(kodi::addon::InputstreamProperty const&) /home/dobo/kodi/inputstream.adaptive/src/main.cpp:86
    xbmc#7 0x7f40131871d5 in kodi::addon::CInstanceInputStream::ADDON_Open(AddonInstance_InputStream const*, INPUTSTREAM_PROPERTY*) (/usr/lib/kodi/addons/inputstream.adaptive/inputstream.adaptive.so.20.3.2+0x3871d5)
    xbmc#8 0x55abad46eddc in CInputStreamAddon::Open() (/usr/lib/kodi/kodi.bin+0xb66ddc)

SUMMARY: AddressSanitizer: heap-use-after-free /home/dobo/kodi/inputstream.adaptive/src/common/AdaptiveStream.cpp:610 in adaptive::AdaptiveStream::start_stream()
Shadow bytes around the buggy address:
  0x0fe884b25cd0: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
  0x0fe884b25ce0: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
  0x0fe884b25cf0: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
  0x0fe884b25d00: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
  0x0fe884b25d10: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
=>0x0fe884b25d20: fd fd fd fd fd fd fd fd fd fd fd fd[fd]fd fd fd
  0x0fe884b25d30: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
  0x0fe884b25d40: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
  0x0fe884b25d50: fd fd fd fd fd fd fd fd fd fd fd fd fa fa fa fa
  0x0fe884b25d60: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0fe884b25d70: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
==21945==ABORTING
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants