Could anyone explain why the following crashes with an access violation at 0xFFFFFFFF at avformat_open_input?
std::string u8(const std::wstring& str)
{
return boost::locale::conv::utf_to_utf<char>(str);
}
AVFormatContext* open_input(const std::wstring& filename)
{
AVFormatContext* context = nullptr;
avformat_open_input(&context, u8(filename).c_str(), nullptr, nullptr);
avformat_find_stream_info(context, nullptr);
return context;
}
while the following works:
AVFormatContext* open_input(const std::wstring& filename)
{
auto u8filename = u8(filename);
AVFormatContext* context = nullptr;
avformat_open_input(&context, u8filename.c_str(), nullptr, nullptr);
avformat_find_stream_info(context, nullptr);
return context;
}
The result of
u8(filename).c_str()should be usable untilavformat_open_inputreturns. It’s probably saving the pointer you give it and then using that duringavformat_find_stream_info.Post the docs for these avformat functions, or their implementations so we can see if it’s actually doing that.
It doesn’t look like
avformat_open_inputis doing anything wrong. Now I suspect that there’s undefined behavior occurring somewhere earlier in the program. Try using a tool like valgrind or static analysis and see if that turns up anything.