-
Notifications
You must be signed in to change notification settings - Fork 239
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
Comments
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
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. |
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 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. What I have done for adding duration: 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. |
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. 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. |
For what I can tell, that what I have done before and I get the ffmepg
error. So to verify that I have right on my speculation I will append just
after the manifest parsing, e.g 1 pattern that will be ~16secondes and play
starting back 16s + 6s. If It play 22s my issue will be solve.
Le 6 avr. 2017 8:14 AM, "Markus Pfau" <notifications@github.com> a écrit :
… 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.
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
<#19 (comment)>,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/AGxYFwfZK7vtCHctn3H9B_3y6_GSnAqnks5rtIK0gaJpZM4MxeXd>
.
|
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? Edit: can you pls. log the fragment-duration here: ? |
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. Edit1: |
In general the fragment duration is simply the sum of all frames * frame_duration. Edit: The first duration is already not ok: 20053334 Tipp: Select "Media" = Audio in inputstream.adaptive settings. Edit2: 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) |
Can you pls download one audio fragment if you are again coding? |
Any audio fragment? |
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. 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; |
Will try it in one hour.
For sure I don't understand what you saying but ((x+9)/10)*10 = x + 9. So
maybe there is a zero missing somewhere or why don't just write
fragmenation +=9.
Le 6 avr. 2017 9:23 PM, "Markus Pfau" <notifications@github.com> a écrit :
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;
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
<#19 (comment)>,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/AGxYF1EkppJwi_4728pdgsjAubgmvVYhks5rtTvBgaJpZM4MxeXd>
.
|
It's an integer division assume dur=5: (5 +9) = 14/10 = 1; Edit: Goal is to have all durations dividable through 10, you can also use modulo for it, I don't care. |
https://forums.iis.net/p/1167897/1944371.aspx#1944371 Interesting article to get the value we're looking for on an other way |
Got it for the integer division thanks.
Glad you find the solution, don't know where is this UUID so I count on
you.
Do you want me to test with fragmentation duration «round» anyway?
Le 6 avr. 2017 21:59, "Markus Pfau" <notifications@github.com> a écrit :
… https://forums.iis.net/p/1167897/1944371.aspx#1944371
Interesting artzicle to get the value we're looking for on an other way
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
<#19 (comment)>,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/AGxYF79DHRg6IrnmAhSKhIZdApczkcruks5rtUQKgaJpZM4MxeXd>
.
|
You can test with the round, it will most probably work for your example but it is not a proper way. |
The latest commit could / should solve the issue |
Thanks a lot. It solved. Keep up the good work. |
thanx for feedback! |
* 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
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
_
The text was updated successfully, but these errors were encountered: