I’m working on Android hard decoding recently. Various attempts have been made on the compatible implementation of soft decoding and hard decoding. Later, I suddenly found that it was unable to decode normally, and even failed to open codec appeared.
Use Because it was copied once at first, but later, if hard decoding was used, the coder was selected again. As a result, the newly applied avcodec context failed to copy the operation parameters from stream to context. When I was RET = avcodec_ Open2 (CTX, codec, nullptr)
the return value is – 1, and the error message is “operation not permitted”. It’s a headache for me. For Android development, permissions, alas AVStream* st = pFormatCtx->streams[streamIdx];
codec_context_ = avcodec_alloc_context3(pCodec);
if (!codec_context_) {
AVLOGE("Failed to allocate the codec context.");
return -1;
}
if (avcodec_parameters_to_context(codec_context_, st->codecpar) < 0) {
AVLOGE("Failed to copy codec parameters to decoder context.");
return -1;
}
if (enable_hw_decode_) {
if (codec_context_->codec_id == AV_CODEC_ID_H264) {
pCodec = avcodec_find_decoder_by_name("h264_mediacodec");
if (pCodec) {
avcodec_free_context(&codec_context_);
codec_context_ = avcodec_alloc_context3(pCodec);
using_hw_decode_ = true;
}
}
}
int ret = 0;
if ((ret = avcodec_open2(codec_context_, pCodec, nullptr)) < 0) {
AVLOGE("Failed to open codec. ret = %d, %s", ret, PAVUtils::get_error_string(ret));
return -1;
}
using_ hw_ decode_ = Add
avcodec before true
_ parameters_ to_ context(codec_ context_, st-> codecpar); Code> and it will work normally
it's strange why the relevant parameters are not copied, instead of returning invalid_ Par returns no instead_ What about permit?