void CodecContext2::setCodec(const Codec &codec, bool resetDefaults, Direction direction, AVMediaType type, OptionalErrorCode 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 (!checkCodec(codec, direction, type, ec)) 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 : AV_CODEC_ID_NONE; m_raw->codec_type = type; 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 !USE_CODECPAR // AVFORMAT < 57.5.0 FF_DISABLE_DEPRECATION_WARNINGS if (m_stream.isValid()) { m_stream.raw()->codec = m_raw; } FF_ENABLE_DEPRECATION_WARNINGS #else //if (m_stream.isValid()) // avcodec_parameters_from_context(m_stream.raw()->codecpar, m_raw); #endif }
void CodecContext2::open(const Codec &codec, AVDictionary **options, OptionalErrorCode ec) { clear_if(ec); if (isOpened() || !isValid()) { throws_if(ec, isOpened() ? Errors::CodecAlreadyOpened : Errors::CodecInvalid); return; } int stat = avcodec_open2(m_raw, codec.raw(), options); if (stat < 0) throws_if(ec, stat, ffmpeg_category()); }
void CodecContext::open(const Codec &codec, AVDictionary **options, error_code &ec) { clear_if(ec); if (m_isOpened || !isValid()) { throws_if(ec, m_isOpened ? Errors::CodecAlreadyOpened : Errors::CodecInvalid); return; } int stat = avcodec_open2(m_raw, codec.isNull() ? m_raw->codec : codec.raw(), options); if (stat < 0) throws_if(ec, stat, ffmpeg_category()); else m_isOpened = true; }
CodecContext2::CodecContext2(const Stream &st, const Codec &codec, Direction direction, AVMediaType type) : m_stream(st) { if (st.direction() != direction) throw av::Exception(make_avcpp_error(Errors::CodecInvalidDirection)); if (st.mediaType() != type) throw av::Exception(make_avcpp_error(Errors::CodecInvalidMediaType)); #if !USE_CODECPAR FF_DISABLE_DEPRECATION_WARNINGS auto const codecId = st.raw()->codec->codec_id; FF_ENABLE_DEPRECATION_WARNINGS #else auto const codecId = st.raw()->codecpar->codec_id; #endif Codec c = codec; if (codec.isNull()) { if (st.direction() == Direction::Decoding) c = findDecodingCodec(codecId); else c = findEncodingCodec(codecId); } #if !USE_CODECPAR FF_DISABLE_DEPRECATION_WARNINGS m_raw = st.raw()->codec; if (!c.isNull()) setCodec(c, false, direction, type); FF_ENABLE_DEPRECATION_WARNINGS #else m_raw = avcodec_alloc_context3(c.raw()); if (m_raw) { avcodec_parameters_to_context(m_raw, st.raw()->codecpar); } #endif }
Stream FormatContext::addStream(const Codec &codec, OptionalErrorCode ec) { clear_if(ec); if (!m_raw) { throws_if(ec, Errors::Unallocated); return Stream(); } if (!outputFormat().codecSupported(codec)) { throws_if(ec, Errors::FormatCodecUnsupported); return Stream(); } auto rawcodec = codec.raw(); AVStream *st = nullptr; st = avformat_new_stream(m_raw, rawcodec); if (!st) { throws_if(ec, Errors::FormatCantAddStream); return Stream(); } auto stream = Stream(m_monitor, st, Direction::Encoding); #if !USE_CODECPAR FF_DISABLE_DEPRECATION_WARNINGS if (st->codec) { if (outputFormat().isFlags(AVFMT_GLOBALHEADER)) { st->codec->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; } } FF_ENABLE_DEPRECATION_WARNINGS #endif return stream; }
CodecContext2::CodecContext2(const Codec &codec, Direction direction, AVMediaType type) { if (checkCodec(codec, direction, type, throws())) m_raw = avcodec_alloc_context3(codec.raw()); }
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; } }
CodecContext::CodecContext(const Codec &codec) { m_raw = avcodec_alloc_context3(codec.raw()); }