mirror of
https://github.com/owntone/owntone-server.git
synced 2024-12-28 08:05:56 -05:00
[transcode] Fix problem for file types where ffmpeg decode returns 0
It seems ffmpeg/libav reads a file type like Monkey's audio in large chunks, so that each packet must be passed to the decoder multiple times. The decoder will return 0 until the packet is completed. This change makes forked-daapd able to deal with a return value of 0.
This commit is contained in:
parent
9a56044c77
commit
1fbb4b0d59
@ -1559,7 +1559,7 @@ transcode_decode(struct decoded_frame **decoded, struct decode_ctx *ctx)
|
|||||||
// data pointer is adjusted with an offset
|
// data pointer is adjusted with an offset
|
||||||
if (used < packet.size)
|
if (used < packet.size)
|
||||||
{
|
{
|
||||||
DPRINTF(E_DBG, L_XCODE, "Decoder did not finish packet, packet will be resumed\n");
|
DPRINTF(E_SPAM, L_XCODE, "Decoder did not finish packet, packet will be resumed\n");
|
||||||
|
|
||||||
ctx->resume_offset += used;
|
ctx->resume_offset += used;
|
||||||
ctx->resume = 1;
|
ctx->resume = 1;
|
||||||
@ -1568,8 +1568,6 @@ transcode_decode(struct decoded_frame **decoded, struct decode_ctx *ctx)
|
|||||||
while (!got_frame);
|
while (!got_frame);
|
||||||
|
|
||||||
// Return the decoded frame and stream index
|
// Return the decoded frame and stream index
|
||||||
frame->pts = av_frame_get_best_effort_timestamp(frame);
|
|
||||||
|
|
||||||
*decoded = malloc(sizeof(struct decoded_frame));
|
*decoded = malloc(sizeof(struct decoded_frame));
|
||||||
if (!*decoded)
|
if (!*decoded)
|
||||||
{
|
{
|
||||||
@ -1582,7 +1580,7 @@ transcode_decode(struct decoded_frame **decoded, struct decode_ctx *ctx)
|
|||||||
(*decoded)->frame = frame;
|
(*decoded)->frame = frame;
|
||||||
(*decoded)->stream_index = stream_index;
|
(*decoded)->stream_index = stream_index;
|
||||||
|
|
||||||
return used;
|
return got_frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Filters and encodes
|
// Filters and encodes
|
||||||
|
@ -62,7 +62,7 @@ transcode_decoded_free(struct decoded_frame *decoded);
|
|||||||
* @out decoded A newly allocated struct with a pointer to the frame and the
|
* @out decoded A newly allocated struct with a pointer to the frame and the
|
||||||
* stream. Must be freed with transcode_decoded_free().
|
* stream. Must be freed with transcode_decoded_free().
|
||||||
* @in ctx Decode context
|
* @in ctx Decode context
|
||||||
* @return Bytes read if OK, negative if error, 0 if EOF
|
* @return Positive if OK, negative if error, 0 if EOF
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
transcode_decode(struct decoded_frame **decoded, struct decode_ctx *ctx);
|
transcode_decode(struct decoded_frame **decoded, struct decode_ctx *ctx);
|
||||||
|
Loading…
Reference in New Issue
Block a user