[Libav-user] alternative to file inputs

Ed Rupp rupp.s.ed at gmail.com
Fri Jan 24 21:17:02 EET 2020


Hey - thanks a lot, that really helped. You focused right in on my issue...
I guess a lot of libav noobs screw up the read function. OK now I'm
getting  FFERRTAG( 'I','N','D','A') at least I'm making better progress
now...
Thanks again!

On Thu, Jan 23, 2020 at 3:41 PM drwho <drwho at infidigm.net> wrote:

>
> avio_alloc_context() is the right direction.  Here is my implementation of
> your "read_fun" which uses a QIODevice
> <https://doc.qt.io/qt-5/qiodevice.html> instead of std::fstream.   libav
> calls read_fun when it wants data.  opaque will point to your ifs.  You
> need to read from ifs and fill libav's buffer (*buf) and then return how
> many bytes you put into the buffer.
>
> static int read_fun(void *opaque, uint8_t *buf, int bufSize)
> {
>     QIODevice *dataStream = (QIODevice *) opaque;
>     bufSize = FFMIN(bufSize, dataStream->bytesAvailable());
>     dataStream->read((char*)buf, bufSize);
>
>     return bufSize;
> }
> On 2020-01-23 1:22 p.m., Ed Rupp wrote:
>
> Hi,
>
> TL;DR; Any direction on how to feed avformat a buffer of bytes (the
> contents of which are a complete file) instead of a file from disk is all I
> really need.
> Thanks for making this lib it's pretty amazing and I'm just getting
> started...
>
> I'm working within a framework in which I receive complete files in the
> form of a uint8_t* and length.
> At first it seemed like the way to go would be custom IO...
> Here's some of the code
> //////////////////////
> AVFormatContext *fmt = avformat_alloc_context();
> std::fstream ifs;
> ifs.read(reinterpret_cast<char*>(my_data_from_framework), length);
> uint8_t *buf = (unsigned char*)av_malloc(8192); // magic number from web
> examples
> //The read functions below us fstream operations tellg and seekp.
> AVIOContext *avio = avio_alloc_context(buf, 8192, 0, (void*)&ifs,
> read_fun, NULL, seek_fun);
> fmt->pb = avio;
>
> //Some of the docs I read made it seem like passing a NULL for filename
> would work.
> int status = avformat_open_input(&fmt, NULL, NULL,NULL)
> //avformat_open_input is returning -1 and yes the seg fault happens at the
> next call below
>
> ///////////////
>
> After doing the above I follow up with the following call and get a
> segfault
>
> avformat_find_stream_info(fmt, NULL);
>
>
> The docs and the code in libformat utils.c: init_input (see below) make it
> seem like I should be able to do this i.e. set pb on AVFormatContext but
> its not doing what I hoped:
> 325 /* Open input file and probe the format if necessary. */
> 326
> <https://www.ffmpeg.org/doxygen/2.5/libavformat_2utils_8c.html#a18b3e6a0f95cd0b00f35765781f19d36>
>  static int init_input
> <https://www.ffmpeg.org/doxygen/2.5/libavformat_2utils_8c.html#a18b3e6a0f95cd0b00f35765781f19d36>
> (AVFormatContext
> <https://www.ffmpeg.org/doxygen/2.5/structAVFormatContext.html> *s
> <https://www.ffmpeg.org/doxygen/2.5/avisynth__c_8h.html#ab87f55bd0280d90925050a4188c14ab5>,
> const char *filename,
> 327  AVDictionary
> <https://www.ffmpeg.org/doxygen/2.5/structAVDictionary.html> **options
> <https://www.ffmpeg.org/doxygen/2.5/ffmpeg_8h.html#abdbaa7127ef32aa4c435f3c609b4c2cd>
> )
> 328 {
> 329  int ret
> <https://www.ffmpeg.org/doxygen/2.5/avfilter_8c.html#a339672ff94e6199019102f50d317c3d7>
> ;
> 330  AVProbeData
> <https://www.ffmpeg.org/doxygen/2.5/structAVProbeData.html> pd = {
> filename, NULL, 0 };
> 331  int score = AVPROBE_SCORE_RETRY
> <https://www.ffmpeg.org/doxygen/2.5/avformat_8h.html#adeacd8263046043734062588db39bce9>
> ;
> 332
> 333  if (s->pb
> <https://www.ffmpeg.org/doxygen/2.5/structAVFormatContext.html#a1e7324262b6b78522e52064daaa7bc87>)
> {
> 334  s->flags
> <https://www.ffmpeg.org/doxygen/2.5/structAVFormatContext.html#a32379cc371463b235d54235d4af06a15>
> |= AVFMT_FLAG_CUSTOM_IO
> <https://www.ffmpeg.org/doxygen/2.5/avformat_8h.html#ac5fdea71141dcc30346a57df75cf408e>
> ;
> 335  if (!s->iformat
> <https://www.ffmpeg.org/doxygen/2.5/structAVFormatContext.html#a78efc5a53c21c8d81197445207ac4374>
> )
> 336  return av_probe_input_buffer2
> <https://www.ffmpeg.org/doxygen/2.5/group__lavf__decoding.html#ga69e44bd9ade0160a8cd6196aa37505ea>
> (s->pb
> <https://www.ffmpeg.org/doxygen/2.5/structAVFormatContext.html#a1e7324262b6b78522e52064daaa7bc87>,
> &s->iformat
> <https://www.ffmpeg.org/doxygen/2.5/structAVFormatContext.html#a78efc5a53c21c8d81197445207ac4374>,
> filename,
> 337  s, 0, s->format_probesize
> <https://www.ffmpeg.org/doxygen/2.5/structAVFormatContext.html#a7d1f665ecabe03e3d18accbb1ebb32b1>
> );
> 338  else if (s->iformat
> <https://www.ffmpeg.org/doxygen/2.5/structAVFormatContext.html#a78efc5a53c21c8d81197445207ac4374>
> ->flags
> <https://www.ffmpeg.org/doxygen/2.5/structAVInputFormat.html#a1b30f6647d0c2faf38ba8786d7c3a838>
> & AVFMT_NOFILE
> <https://www.ffmpeg.org/doxygen/2.5/avformat_8h.html#a752cce390d480521919aa5d8be24ac0b>
> )
> 339  av_log
> <https://www.ffmpeg.org/doxygen/2.5/log_8c.html#a33c4311b86f031152c5a23b91c4fe862>(s,
> AV_LOG_WARNING
> <https://www.ffmpeg.org/doxygen/2.5/group__lavu__log__constants.html#ga85b57516ca703cc47d9bbe5f4658c716>,
> "Custom AVIOContext makes no sense and "
> 340  "will be ignored with AVFMT_NOFILE format.\n");
> 341  return 0;
> 342  }
> 343
> 344  if ((s->iformat
> <https://www.ffmpeg.org/doxygen/2.5/structAVFormatContext.html#a78efc5a53c21c8d81197445207ac4374>
> && s->iformat
> <https://www.ffmpeg.org/doxygen/2.5/structAVFormatContext.html#a78efc5a53c21c8d81197445207ac4374>
> ->flags
> <https://www.ffmpeg.org/doxygen/2.5/structAVInputFormat.html#a1b30f6647d0c2faf38ba8786d7c3a838>
> & AVFMT_NOFILE
> <https://www.ffmpeg.org/doxygen/2.5/avformat_8h.html#a752cce390d480521919aa5d8be24ac0b>)
> ||
> 345  (!s->iformat
> <https://www.ffmpeg.org/doxygen/2.5/structAVFormatContext.html#a78efc5a53c21c8d81197445207ac4374>
> && (s->iformat
> <https://www.ffmpeg.org/doxygen/2.5/structAVFormatContext.html#a78efc5a53c21c8d81197445207ac4374>
> = av_probe_input_format2
> <https://www.ffmpeg.org/doxygen/2.5/group__lavf__decoding.html#gae8b938f6e7c3741dd27a6c171e72f33d>(&pd,
> 0, &score))))
> 346  return score;
> 347
> 348  if ((ret = avio_open2
> <https://www.ffmpeg.org/doxygen/2.5/avio_8h.html#ade8a63980569494c99593ebf0d1e891b>
> (&s->pb
> <https://www.ffmpeg.org/doxygen/2.5/structAVFormatContext.html#a1e7324262b6b78522e52064daaa7bc87>,
> filename, AVIO_FLAG_READ
> <https://www.ffmpeg.org/doxygen/2.5/avio_8h.html#a21e61cb486bd1588eb7f775998cf8c77>
> | s->avio_flags
> <https://www.ffmpeg.org/doxygen/2.5/structAVFormatContext.html#a5e6814c9de3c272396f07e2ff18c7b27>
> ,
> 349  &s->interrupt_callback
> <https://www.ffmpeg.org/doxygen/2.5/structAVFormatContext.html#a5b37acfe4024d92ee510064e80920b40>,
> options)) < 0)
> 350  return ret
> <https://www.ffmpeg.org/doxygen/2.5/avfilter_8c.html#a339672ff94e6199019102f50d317c3d7>
> ;
> 351  if (s->iformat
> <https://www.ffmpeg.org/doxygen/2.5/structAVFormatContext.html#a78efc5a53c21c8d81197445207ac4374>
> )
> 352  return 0;
> 353  return av_probe_input_buffer2
> <https://www.ffmpeg.org/doxygen/2.5/group__lavf__decoding.html#ga69e44bd9ade0160a8cd6196aa37505ea>
> (s->pb
> <https://www.ffmpeg.org/doxygen/2.5/structAVFormatContext.html#a1e7324262b6b78522e52064daaa7bc87>,
> &s->iformat
> <https://www.ffmpeg.org/doxygen/2.5/structAVFormatContext.html#a78efc5a53c21c8d81197445207ac4374>,
> filename,
> 354
> Thanks
> Ed
>
> _______________________________________________
> Libav-user mailing listLibav-user at ffmpeg.orghttps://ffmpeg.org/mailman/listinfo/libav-user
>
> To unsubscribe, visit link above, or emaillibav-user-request at ffmpeg.org with subject "unsubscribe".
>
> _______________________________________________
> Libav-user mailing list
> Libav-user at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/libav-user
>
> To unsubscribe, visit link above, or email
> libav-user-request at ffmpeg.org with subject "unsubscribe".
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://ffmpeg.org/pipermail/libav-user/attachments/20200124/d9388ed5/attachment.html>


More information about the Libav-user mailing list