bool CodecContext2::checkCodec(const Codec &codec, Direction direction, AVMediaType type, OptionalErrorCode ec) { if (direction == Direction::Encoding && !codec.canEncode()) { fflog(AV_LOG_WARNING, "Encoding context, but codec does not support encoding\n"); throws_if(ec, Errors::CodecInvalidDirection); return false; } if (direction == Direction::Decoding && !codec.canDecode()) { fflog(AV_LOG_WARNING, "Decoding context, but codec does not support decoding\n"); throws_if(ec, Errors::CodecInvalidDirection); return false; } if (type != codec.type()) { fflog(AV_LOG_ERROR, "Media type mismatch\n"); throws_if(ec, Errors::CodecInvalidMediaType); return false; } return true; }
void CodecContext::setCodec(const Codec &codec, bool resetDefaults, error_code &ec) { clear_if(ec); if (!m_raw) { fflog(AV_LOG_WARNING, "Codec context does not allocated\n"); throws_if(ec, Errors::Unallocated); return; } if (!m_raw || (!m_stream.isValid() && !m_stream.isNull())) { fflog(AV_LOG_WARNING, "Parent stream is not valid. Probably it or FormatContext destroyed\n"); throws_if(ec, Errors::CodecStreamInvalid); return; } if (codec.isNull()) { fflog(AV_LOG_WARNING, "Try to set null codec\n"); } if (m_direction == Direction::ENCODING && codec.canEncode() == false) { fflog(AV_LOG_WARNING, "Encoding context, but codec does not support encoding\n"); throws_if(ec, Errors::CodecInvalidDirection); return; } if (m_direction == Direction::DECODING && codec.canDecode() == false) { fflog(AV_LOG_WARNING, "Decoding context, but codec does not support decoding\n"); throws_if(ec, Errors::CodecInvalidDirection); return; } if (resetDefaults) { if (!m_raw->codec) { avcodec_free_context(&m_raw); m_raw = avcodec_alloc_context3(codec.raw()); } else { avcodec_get_context_defaults3(m_raw, codec.raw()); } } else { m_raw->codec_id = !codec.isNull() ? codec.raw()->id : CODEC_ID_NONE; m_raw->codec_type = !codec.isNull() ? codec.raw()->type : AVMEDIA_TYPE_UNKNOWN; m_raw->codec = codec.raw(); if (!codec.isNull()) { if (codec.raw()->pix_fmts != 0) m_raw->pix_fmt = *(codec.raw()->pix_fmts); // assign default value if (codec.raw()->sample_fmts != 0) m_raw->sample_fmt = *(codec.raw()->sample_fmts); } } if (m_stream.isValid()) { m_stream.raw()->codec = m_raw; } }