Hello - I have two files which play back in VLC correctly. They were encoded using this command: ffmpeg -y -i '/tmp/2e905b981d30324f9a0664cbabb3f59a20170406-21128-r0neh9.wav' -acodec libvorbis '/tmp/2e905b981d30324f9a0664cbabb3f59a20170406-21128-r0neh920170406-21128-146yyex.ogg However ov_pcm_total reports a zero length for one of the two files. Is this a problem with my use of the ov_pcm_total function or a problem with the encoding? The files are here http://www.credland.net/ogg/ along with a copy of the source code. This is a problem because the same function call is used by the JUCE ogg decoder we are using in an application. Any thoughts? thanks in advance, Jim. The output is: jim at snoopy ~/trouble.vorbis/a $ ./a < 53884c2935e6b47938f91ca78b0c2473a85730833138370caedbb66a74995130.ogg encoder=Lavf53.32.100 Bitstream is 2 channel, 44100Hz Encoded by: Lavf53.32.100 Length: 0 jim at snoopy ~/trouble.vorbis/a $ ./a < d7d5ef8e6c7fad33f922924d0a05591277654d53941d43518f1fe8580c7ea3f9.ogg encoder=Lavf53.32.100 Bitstream is 2 channel, 44100Hz Encoded by: Lavf53.32.100 Length: 1146624 Source: #include <stdio.h> #include <stdlib.h> #include <math.h> #include "vorbis/codec.h" #include "vorbis/vorbisfile.h" #ifdef _WIN32 #include <io.h> #include <fcntl.h> #endif char pcmout[4096]; int main (int argc, char** argv) { OggVorbis_File vf; int eof = 0; int current_section; #ifdef _WIN32 _setmode (_fileno (stdin), _O_BINARY); _setmode (_fileno (stdout), _O_BINARY); #endif if (ov_open_callbacks (stdin, &vf, NULL, 0, OV_CALLBACKS_NOCLOSE) < 0) { fprintf (stderr, "Input does not appear to be an Ogg bitstream.\n"); exit (1); } { char** ptr = ov_comment (&vf, -1)->user_comments; vorbis_info* vi = ov_info (&vf, -1); while (*ptr) { fprintf (stderr, "%s\n", *ptr); ++ptr; } fprintf (stderr, "\nBitstream is %d channel, %ldHz\n", vi->channels, vi->rate); fprintf (stderr, "Encoded by: %s\n\n", ov_comment (&vf, -1)->vendor); fprintf (stderr, "Length: %lld\n\n", ov_pcm_total(&vf, -1)); } return 0; }
Hello - I send this to the vorbis-dev list yesterday, but I’m working if it would not have been better targeted at this list. Sorry for the spam if you are on both :)> Begin forwarded message: > > From: Jim Credland <jim at credland.net> > Subject: [Vorbis-dev] Zero length reported. > Date: 6 April 2017 at 15:43:18 BST > To: vorbis-dev at xiph.org > Cc: Maciej Dudek <maciej.dudek at gmail.com> > > Hello - I have two files which play back in VLC correctly. > > They were encoded using this command: > > ffmpeg -y -i '/tmp/2e905b981d30324f9a0664cbabb3f59a20170406-21128-r0neh9.wav' -acodec libvorbis '/tmp/2e905b981d30324f9a0664cbabb3f59a20170406-21128-r0neh920170406-21128-146yyex.ogg > > However ov_pcm_total reports a zero length for one of the two files. Is this a problem with my use of the ov_pcm_total function or a problem with the encoding? The files are here http://www.credland.net/ogg/ along with a copy of the source code. > > This is a problem because the same function call is used by the JUCE ogg decoder we are using in an application. > > Any thoughts? > > thanks in advance, Jim. > > > > The output is: > > jim at snoopy ~/trouble.vorbis/a > $ ./a < 53884c2935e6b47938f91ca78b0c2473a85730833138370caedbb66a74995130.ogg > encoder=Lavf53.32.100 > > Bitstream is 2 channel, 44100Hz > Encoded by: Lavf53.32.100 > > Length: 0 > > jim at snoopy ~/trouble.vorbis/a > $ ./a < d7d5ef8e6c7fad33f922924d0a05591277654d53941d43518f1fe8580c7ea3f9.ogg > encoder=Lavf53.32.100 > > Bitstream is 2 channel, 44100Hz > Encoded by: Lavf53.32.100 > > Length: 1146624 > > > Source: > > #include <stdio.h> > #include <stdlib.h> > #include <math.h> > #include "vorbis/codec.h" > #include "vorbis/vorbisfile.h" > > #ifdef _WIN32 > #include <io.h> > #include <fcntl.h> > #endif > > char pcmout[4096]; > > int main (int argc, char** argv) > { > OggVorbis_File vf; > int eof = 0; > int current_section; > > #ifdef _WIN32 > _setmode (_fileno (stdin), _O_BINARY); > _setmode (_fileno (stdout), _O_BINARY); > #endif > > if (ov_open_callbacks (stdin, &vf, NULL, 0, OV_CALLBACKS_NOCLOSE) < 0) > { > fprintf (stderr, "Input does not appear to be an Ogg bitstream.\n"); > exit (1); > } > > { > char** ptr = ov_comment (&vf, -1)->user_comments; > vorbis_info* vi = ov_info (&vf, -1); > > while (*ptr) > { > fprintf (stderr, "%s\n", *ptr); > ++ptr; > } > > fprintf (stderr, "\nBitstream is %d channel, %ldHz\n", vi->channels, vi->rate); > fprintf (stderr, "Encoded by: %s\n\n", ov_comment (&vf, -1)->vendor); > fprintf (stderr, "Length: %lld\n\n", ov_pcm_total(&vf, -1)); > } > > return 0; > } > _______________________________________________ > Vorbis-dev mailing list > Vorbis-dev at xiph.org > http://lists.xiph.org/mailman/listinfo/vorbis-dev-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.xiph.org/pipermail/vorbis/attachments/20170407/8eef9b2e/attachment.html>
Okay - so I stepped through the code slowly this morning making notes as I went. And I can see what’s wrong. The last Ogg header of the troublesome file contains -1 as the granule position. The spec says this has a special meaning "A special value of '-1' (in two's complement) indicates that no packets finish on this page." 4F 67 67 53 00 04 FF FF FF FF FF FF FF FF 16 A2 F3 7C 10 00 00 00 D1 4A 44 5E 00 And the files that play correctly do not have this problem: 4F 67 67 53 00 04 00 7F 11 00 00 00 00 00 76 EF C3 4C 16 00 00 00 94 50 4F B4 01 49 1C 4B F0 85 64 91 64 9E 84 59 EB F5 8E 06 83 43 C1 1C E9 9C BC E9 EF EB DC 7D BF EF 25 54 C6 EF FF 7D FE 72 F9 FE 63 3F FE F5 E7 5B D4 BA 17 C7 41 25 6D 31 2D EA A5 AE 9A 56 F3 F1 DE A6 F9 F5 5E 89 DE 53 2F CB F4 F8 07 What does 'no packets finish on this page’ mean and why might that appear at the end of a file? I’m guessing this is an encoding problem..> On 7 Apr 2017, at 13:31, Jim Credland <jim at credland.net> wrote: > > Hello - I send this to the vorbis-dev list yesterday, but I’m working if it would not have been better targeted at this list. > > Sorry for the spam if you are on both :) > >> Begin forwarded message: >> >> From: Jim Credland <jim at credland.net> >> Subject: [Vorbis-dev] Zero length reported. >> Date: 6 April 2017 at 15:43:18 BST >> To: vorbis-dev at xiph.org >> Cc: Maciej Dudek <maciej.dudek at gmail.com> >> >> Hello - I have two files which play back in VLC correctly. >> >> They were encoded using this command: >> >> ffmpeg -y -i '/tmp/2e905b981d30324f9a0664cbabb3f59a20170406-21128-r0neh9.wav' -acodec libvorbis '/tmp/2e905b981d30324f9a0664cbabb3f59a20170406-21128-r0neh920170406-21128-146yyex.ogg >> >> However ov_pcm_total reports a zero length for one of the two files. Is this a problem with my use of the ov_pcm_total function or a problem with the encoding? The files are here http://www.credland.net/ogg/ along with a copy of the source code. >> >> This is a problem because the same function call is used by the JUCE ogg decoder we are using in an application. >> >> Any thoughts? >> >> thanks in advance, Jim. >> >> >> >> The output is: >> >> jim at snoopy ~/trouble.vorbis/a >> $ ./a < 53884c2935e6b47938f91ca78b0c2473a85730833138370caedbb66a74995130.ogg >> encoder=Lavf53.32.100 >> >> Bitstream is 2 channel, 44100Hz >> Encoded by: Lavf53.32.100 >> >> Length: 0 >> >> jim at snoopy ~/trouble.vorbis/a >> $ ./a < d7d5ef8e6c7fad33f922924d0a05591277654d53941d43518f1fe8580c7ea3f9.ogg >> encoder=Lavf53.32.100 >> >> Bitstream is 2 channel, 44100Hz >> Encoded by: Lavf53.32.100 >> >> Length: 1146624 >> >> >> Source: >> >> #include <stdio.h> >> #include <stdlib.h> >> #include <math.h> >> #include "vorbis/codec.h" >> #include "vorbis/vorbisfile.h" >> >> #ifdef _WIN32 >> #include <io.h> >> #include <fcntl.h> >> #endif >> >> char pcmout[4096]; >> >> int main (int argc, char** argv) >> { >> OggVorbis_File vf; >> int eof = 0; >> int current_section; >> >> #ifdef _WIN32 >> _setmode (_fileno (stdin), _O_BINARY); >> _setmode (_fileno (stdout), _O_BINARY); >> #endif >> >> if (ov_open_callbacks (stdin, &vf, NULL, 0, OV_CALLBACKS_NOCLOSE) < 0) >> { >> fprintf (stderr, "Input does not appear to be an Ogg bitstream.\n"); >> exit (1); >> } >> >> { >> char** ptr = ov_comment (&vf, -1)->user_comments; >> vorbis_info* vi = ov_info (&vf, -1); >> >> while (*ptr) >> { >> fprintf (stderr, "%s\n", *ptr); >> ++ptr; >> } >> >> fprintf (stderr, "\nBitstream is %d channel, %ldHz\n", vi->channels, vi->rate); >> fprintf (stderr, "Encoded by: %s\n\n", ov_comment (&vf, -1)->vendor); >> fprintf (stderr, "Length: %lld\n\n", ov_pcm_total(&vf, -1)); >> } >> >> return 0; >> } >> _______________________________________________ >> Vorbis-dev mailing list >> Vorbis-dev at xiph.org >> http://lists.xiph.org/mailman/listinfo/vorbis-dev >