[Libav-user] alternative to file inputs

Ed Rupp rupp.s.ed at gmail.com
Thu Jan 23 20:22:23 EET 2020


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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://ffmpeg.org/pipermail/libav-user/attachments/20200123/af420566/attachment.html>


More information about the Libav-user mailing list