Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(90)

Issue 2855373002: Use ffmpeg packet.pos for restarting reading after reenabling video

Created:
3 years, 7 months ago by servolk
Modified:
3 years, 6 months ago
CC:
chromium-reviews, feature-media-reviews_chromium.org, mlamouri (slow - plz ping), posciak+watch_chromium.org
Target Ref:
refs/heads/master
Project:
chromium
Visibility:
Public.

Description

Use ffmpeg packet.pos for restarting reading after reenabling video FFmpeg has a single file read position shared between all active sub-streams. But when we are restarting an individual sub-stream we'd like to seek and read previous buffers only for that restarted stream, without duplicating the already seen packets for other substreams. Luckily FFmpeg's AVPacket has a pos field, which indicates the file position that packet was read from. So when we need to restart a video stream, we can do a seek backward in the file and then drop packets for other streams until we reach a previous read position, and at that point we'll restart reading all streams. BUG=709302

Patch Set 1 #

Patch Set 2 : fixed audio rewinding #

Total comments: 15

Patch Set 3 : nits #

Patch Set 4 : Refactor some common code into SeekInternal #

Patch Set 5 : Extract some more seek logic and add comments for SeekInternal #

Total comments: 10

Patch Set 6 : Handle track re-enabling during seek and seek initiated during track re-enabling #

Patch Set 7 : Added some unit tests + some fixes #

Patch Set 8 : rebase #

Patch Set 9 : Reset pending_seek_position_ in AbortPendingReads (fixes test failures) #

Patch Set 10 : reset pending_seek_position_ after calling the pending_seek_cb_ #

Total comments: 14
Unified diffs Side-by-side diffs Delta from patch set Stats (+292 lines, -49 lines) Patch
M media/filters/ffmpeg_demuxer.h View 1 2 3 4 5 6 6 chunks +26 lines, -0 lines 3 comments Download
M media/filters/ffmpeg_demuxer.cc View 1 2 3 4 5 6 7 8 9 14 chunks +154 lines, -49 lines 11 comments Download
M media/filters/ffmpeg_demuxer_unittest.cc View 1 2 3 4 5 6 7 8 2 chunks +112 lines, -0 lines 0 comments Download

Messages

Total messages: 62 (38 generated)
servolk
3 years, 7 months ago (2017-05-04 18:50:12 UTC) #9
DaleCurtis
looking good, but needs some tests. +xhwang since you probably won't have the tests ready ...
3 years, 7 months ago (2017-05-04 18:53:03 UTC) #11
servolk
https://codereview.chromium.org/2855373002/diff/20001/media/filters/ffmpeg_demuxer.cc File media/filters/ffmpeg_demuxer.cc (right): https://codereview.chromium.org/2855373002/diff/20001/media/filters/ffmpeg_demuxer.cc#newcode1737 media/filters/ffmpeg_demuxer.cc:1737: base::TimeDelta seek_time = On 2017/05/04 18:53:03, DaleCurtis_OOO_May_5_To_May23 wrote: > ...
3 years, 7 months ago (2017-05-04 19:15:16 UTC) #12
DaleCurtis
https://codereview.chromium.org/2855373002/diff/20001/media/filters/ffmpeg_demuxer.cc File media/filters/ffmpeg_demuxer.cc (right): https://codereview.chromium.org/2855373002/diff/20001/media/filters/ffmpeg_demuxer.cc#newcode1764 media/filters/ffmpeg_demuxer.cc:1764: restarting_stream_ = stream; On 2017/05/04 at 19:15:16, servolk wrote: ...
3 years, 7 months ago (2017-05-04 21:21:06 UTC) #17
servolk
https://codereview.chromium.org/2855373002/diff/20001/media/filters/ffmpeg_demuxer.cc File media/filters/ffmpeg_demuxer.cc (right): https://codereview.chromium.org/2855373002/diff/20001/media/filters/ffmpeg_demuxer.cc#newcode1764 media/filters/ffmpeg_demuxer.cc:1764: restarting_stream_ = stream; On 2017/05/04 21:21:06, DaleCurtis_OOO_May_5_To_May23 wrote: > ...
3 years, 7 months ago (2017-05-04 21:38:30 UTC) #18
DaleCurtis
https://codereview.chromium.org/2855373002/diff/20001/media/filters/ffmpeg_demuxer.cc File media/filters/ffmpeg_demuxer.cc (right): https://codereview.chromium.org/2855373002/diff/20001/media/filters/ffmpeg_demuxer.cc#newcode1764 media/filters/ffmpeg_demuxer.cc:1764: restarting_stream_ = stream; On 2017/05/04 at 21:38:30, servolk wrote: ...
3 years, 7 months ago (2017-05-04 21:41:13 UTC) #19
DaleCurtis
https://codereview.chromium.org/2855373002/diff/20001/media/filters/ffmpeg_demuxer.cc File media/filters/ffmpeg_demuxer.cc (right): https://codereview.chromium.org/2855373002/diff/20001/media/filters/ffmpeg_demuxer.cc#newcode1764 media/filters/ffmpeg_demuxer.cc:1764: restarting_stream_ = stream; On 2017/05/04 at 21:41:12, DaleCurtis_OOO_May_5_To_May23 wrote: ...
3 years, 7 months ago (2017-05-04 21:46:12 UTC) #20
servolk
https://codereview.chromium.org/2855373002/diff/20001/media/filters/ffmpeg_demuxer.cc File media/filters/ffmpeg_demuxer.cc (right): https://codereview.chromium.org/2855373002/diff/20001/media/filters/ffmpeg_demuxer.cc#newcode1737 media/filters/ffmpeg_demuxer.cc:1737: base::TimeDelta seek_time = On 2017/05/04 19:15:16, servolk wrote: > ...
3 years, 7 months ago (2017-05-04 22:13:16 UTC) #23
wolenetz
Some comments added. +sandersd@ due to Dale OoO and sandersd@ also reviewing previous ffmpeg-read-canceling changes. ...
3 years, 7 months ago (2017-05-08 20:55:34 UTC) #27
sandersd (OOO until July 31)
No additional concerns beyond what wolenetz@ already commented on. https://codereview.chromium.org/2855373002/diff/80001/media/filters/ffmpeg_demuxer.cc File media/filters/ffmpeg_demuxer.cc (right): https://codereview.chromium.org/2855373002/diff/80001/media/filters/ffmpeg_demuxer.cc#newcode1705 media/filters/ffmpeg_demuxer.cc:1705: ...
3 years, 7 months ago (2017-05-10 22:27:49 UTC) #28
servolk
https://codereview.chromium.org/2855373002/diff/80001/media/filters/ffmpeg_demuxer.cc File media/filters/ffmpeg_demuxer.cc (right): https://codereview.chromium.org/2855373002/diff/80001/media/filters/ffmpeg_demuxer.cc#newcode1695 media/filters/ffmpeg_demuxer.cc:1695: SeekInternal(curr_time, selected_stream, On 2017/05/08 20:55:33, wolenetz_ooo_May_10 wrote: > could ...
3 years, 7 months ago (2017-05-12 00:55:37 UTC) #29
servolk
On 2017/05/12 00:55:37, servolk wrote: > https://codereview.chromium.org/2855373002/diff/80001/media/filters/ffmpeg_demuxer.cc > File media/filters/ffmpeg_demuxer.cc (right): > > https://codereview.chromium.org/2855373002/diff/80001/media/filters/ffmpeg_demuxer.cc#newcode1695 > ...
3 years, 7 months ago (2017-05-23 21:52:51 UTC) #50
DaleCurtis
https://codereview.chromium.org/2855373002/diff/180001/media/filters/ffmpeg_demuxer.cc File media/filters/ffmpeg_demuxer.cc (right): https://codereview.chromium.org/2855373002/diff/180001/media/filters/ffmpeg_demuxer.cc#newcode55 media/filters/ffmpeg_demuxer.cc:55: const base::TimeDelta kDefaultStreamCapacity = base::TimeDelta::FromSeconds(2); constexpr or this is ...
3 years, 7 months ago (2017-05-24 22:24:18 UTC) #51
servolk
https://codereview.chromium.org/2855373002/diff/180001/media/filters/ffmpeg_demuxer.cc File media/filters/ffmpeg_demuxer.cc (right): https://codereview.chromium.org/2855373002/diff/180001/media/filters/ffmpeg_demuxer.cc#newcode55 media/filters/ffmpeg_demuxer.cc:55: const base::TimeDelta kDefaultStreamCapacity = base::TimeDelta::FromSeconds(2); On 2017/05/24 22:24:17, DaleCurtis ...
3 years, 7 months ago (2017-05-24 22:58:20 UTC) #52
DaleCurtis
https://codereview.chromium.org/2855373002/diff/180001/media/filters/ffmpeg_demuxer.cc File media/filters/ffmpeg_demuxer.cc (right): https://codereview.chromium.org/2855373002/diff/180001/media/filters/ffmpeg_demuxer.cc#newcode1733 media/filters/ffmpeg_demuxer.cc:1733: } else { On 2017/05/24 at 22:58:19, servolk wrote: ...
3 years, 7 months ago (2017-05-24 23:15:46 UTC) #53
servolk
On 2017/05/24 23:15:46, DaleCurtis wrote: > https://codereview.chromium.org/2855373002/diff/180001/media/filters/ffmpeg_demuxer.cc > File media/filters/ffmpeg_demuxer.cc (right): > > https://codereview.chromium.org/2855373002/diff/180001/media/filters/ffmpeg_demuxer.cc#newcode1733 > ...
3 years, 7 months ago (2017-05-24 23:49:05 UTC) #54
DaleCurtis
I don't think there's any rush to land this half-done; we won't be able to ...
3 years, 7 months ago (2017-05-25 00:08:07 UTC) #55
whywhat
+Mounir for context
3 years, 7 months ago (2017-05-26 16:24:19 UTC) #56
DaleCurtis
What's up with this servolk? Did you run into some issues with this approach?
3 years, 6 months ago (2017-06-14 00:30:57 UTC) #57
servolk
On 2017/06/14 00:30:57, DaleCurtis wrote: > What's up with this servolk? Did you run into ...
3 years, 6 months ago (2017-06-14 01:02:20 UTC) #58
DaleCurtis
Thanks for the update, sheriff today but will dive into your comment tomorrow.
3 years, 6 months ago (2017-06-14 19:21:49 UTC) #59
DaleCurtis
On 2017/06/14 at 19:21:49, DaleCurtis wrote: > Thanks for the update, sheriff today but will ...
3 years, 6 months ago (2017-06-15 20:08:31 UTC) #60
servolk
On 2017/06/15 20:08:31, DaleCurtis wrote: > On 2017/06/14 at 19:21:49, DaleCurtis wrote: > > Thanks ...
3 years, 6 months ago (2017-06-20 01:44:59 UTC) #61
DaleCurtis
3 years, 6 months ago (2017-06-20 16:54:06 UTC) #62
On 2017/06/20 at 01:44:59, servolk wrote:
> On 2017/06/15 20:08:31, DaleCurtis wrote:
> > On 2017/06/14 at 19:21:49, DaleCurtis wrote:
> > > Thanks for the update, sheriff today but will dive into your comment
tomorrow.
> > 
> > Argh, I had a long draft comment here that got deleted by BeyondCorp :(
Here's
> > take 2:
> > 
> > I think the root of all our issues stem from the fact that we allowed
> > MediaResource::SetStreamStatusChangedCB to be called from the Renderer; we
> > should not have. By doing so we've introduced a back channel which has
renderer
> > state implications that the pipeline is unaware of.
> > 
> > Instead PipelineImpl and PipelineController should have a new kTrackChanging
> > state; they should pass a PipelineStatusCB into
OnEnabledAudioTracksChanged()
> > and OnSelectedVideoTrackChanged(). PipelineController should have queuing
code
> > for handling pending seek / pending track change operations. PipelineImpl
should
> > trigger the demuxer track change and provide a PipelineStatusCB. When that
> > completes it should trigger a new
> > Renderer::OnAudioTracksChanged(PipelineStatusCB),
> > Renderer::OnVideoTracksChanged(PipelineStatusCB) methods. These methods
should
> > be split apart from the existing RendererImpl::OnStreamStatusChanged()
method,
> > but largely do as they do today. When the renderers have been flushed and
> > restarted, they should fire the pipeline status cb. This will percolate back
up
> > and the Pipeline will resume allowing other state change events.
> > 
> > We don't need the DemuxerStream pointer passed back to
OnStreamStatusChanged()
> > today since we only allow one enabled track, we can just reuse
> > MediaResource::GetFirstStream(); later we could add a
> > MediaResource::GetStreamForTrackID() to handle the multiple audio/video
case.
> > This allows us to delete the lock hack added to RendererImpl since
PipelineImpl
> > will handle media time caching during track changes (like it does for seek).
It
> > allows us not to worry about the interplay of seeks and track changes since
> > we'll have one top level arbiter. This keeps our code consistent with what
we're
> > doing for seeks; i.e. all async operations must be complete before other
state
> > change events are allowed.
> > 
> > Another potential improvement after the above is done s to allow renderer
> > re-initialization similar to how config changes work today. Pipeline would
call
> > something like Renderer::Flush(<tracks>), Demuxer::OnXXXTracksChanged(),
then
> > Renderer::Initialize(<tracks>). This allows us to avoid having any special
logic
> > in RendererImpl for track changes.
> 
> Well, I suppose we could do something like that. Although it will be a much
larger change than this one, as we'd have to change some core logic and APIs
between Pipeline - Demuxer - Renderer. Also with the approach you suggested
(where Pipeline notifies the demuxer and then the renderer about track changes)
we might need to keep track of track statuses in both demuxers and renderers.
Perhaps it would be better to just always handle track changes through Pipeline
-> Renderer and then let the Renderer disable/enable demuxer streams as
necessary? Anyway I think I'll give this approach a try later this week and see
how it might work in practice.

Only pipeline should have to track the status, just like seeks do today. The
pipeline prevents all reentrancy during pending operations. Demuxer and renderer
can just assume that they will never have concurrent operations inflicted upon
them. I.e. seek and track changes are mutually exclusive and pending seeks/track
changes are queued.

I think without this larger change, we're going to forever be hunting down
subtle bugs of operational reentrancy. Especially in something that will end up
as frequently used as seeks on tab changes; such as this CL proposes.

Powered by Google App Engine
This is Rietveld 408576698