[rtmpdump] Patch: improve recovery by scanning forward following packet headers to find last valid packet offset

Peter Pickford rtmpdump at netremedies.ca
Fri Nov 28 09:47:25 CET 2014


Looks like the bbc breaks that last few tags when  a download times out.

This patch checks the previous tag payloadsize against the current
tags prevtaglength.

On 4 November 2014 at 16:04, Peter Pickford <rtmpdump at netremedies.ca> wrote:
> diff --git a/rtmpdump.c b/rtmpdump.c
> index 13741a7..5a69395 100644
> --- a/rtmpdump.c
> +++ b/rtmpdump.c
> @@ -303,8 +303,29 @@ GetLastKeyframe(FILE * file,       // output file [in]
>    // find the last seekable frame
>    off_t tsize = 0;
>    uint32_t prevTagSize = 0;
> +  uint32_t headerSize = 0;
> +  uint32_t payloadSize = 0;
> +  off_t offset = 0;
> +  off_t lastGoodTag = 0;
>
>    // go through the file and find the last video keyframe
> +  fseek(file, 5, SEEK_SET);
> +  if (fread(buffer, 1, 4, file) != 4) {
> +       RTMP_Log(RTMP_LOGERROR, "Couldn't read headerSize from file!");
> +       return RD_FAILED;
> +  }
> +  headerSize = AMF_DecodeInt32(buffer);
> +  offset = headerSize;
> +  while (offset < size) {
> +       fseeko(file, offset + 5, SEEK_SET);
> +       if (fread(buffer, 1, 4, file) != 4) {
> +               break;
> +       }
> +       payloadSize = AMF_DecodeInt24(buffer);
> +       lastGoodTag = offset;
> +       offset += payloadSize + 15; // the back pointer the tag header
> and the payload
> +  }
> +  tsize = size - lastGoodTag - 4; // set tsize to point to offset
> from end of file of the header of last good tag
>    do
>      {
>        int xread;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: rtmpdump_resume.patch
Type: text/x-patch
Size: 2802 bytes
Desc: not available
URL: <https://lists.mplayerhq.hu/pipermail/rtmpdump/attachments/20141128/1f9cbace/attachment.bin>


More information about the rtmpdump mailing list