Opened 13 years ago
Closed 11 years ago
#10658 closed Developer Task (Won't Fix)
Allow partial AVFRingBuffer reads
Reported by: | danielk | Owned by: | danielk |
---|---|---|---|
Priority: | minor | Milestone: | 0.28 |
Component: | MythTV - General | Version: | Master Head |
Severity: | medium | Keywords: | |
Cc: | Ticket locked: | no |
Description (last modified by )
Traditionally we've always had RingBuffer::Read() return the number of bytes requested unless we are at the end of the file. But this blocks libav which expects this the read to complete fairly quickly even if it is a blocking read. Instead we should block for only a short time waiting for more data and then return what data we do have as long as we have at least 1 byte of data.
Attachments (3)
Change History (9)
Changed 13 years ago by
Attachment: | 10658-v1.patch added |
---|
comment:1 Changed 13 years ago by
Owner: | set to danielk |
---|---|
Status: | new → accepted |
Type: | Bug Report - General → Developer Task |
Version: | Unspecified → Master Head |
comment:2 Changed 12 years ago by
Milestone: | 0.26 → 0.27 |
---|
comment:3 Changed 12 years ago by
With some debugging I've discovered that if you return -EAGAIN a number of times to libav it will mark the stream as having hit EOF. Even if you later reset the EOF flag any partially decoded data will be chucked by libav.
This means this solution is unworkable as is. However, we can still return partial reads as long as we avoid returning zero byte reads or -EAGAIN reads.
Changed 12 years ago by
Attachment: | 10658-v2.patch added |
---|
Rework which allows short reads, but still avoids ever returning 0 bytes.
comment:4 Changed 12 years ago by
Description: | modified (diff) |
---|---|
Summary: | Rework AVFRingBuffer to return -EAGAIN when there is no data → Allow partial AVFRingBuffer reads |
Changed 12 years ago by
Attachment: | 10490-debug-start-new-rec-every-30-sec-v2.patch added |
---|
debugging patch
comment:5 Changed 11 years ago by
Milestone: | 0.27 → 0.28 |
---|
comment:6 Changed 11 years ago by
Resolution: | → Won't Fix |
---|---|
Status: | accepted → closed |
most of this is now unecessary as 1- ffmpeg doesn't consider having reached EOF when Read returns 0 2- RingBuffer::run will manage small read
Initial patch