Krita Source Code Documentation
Loading...
Searching...
No Matches
KisAndroidMediaEncoderRunnable::Context Class Reference

Public Member Functions

bool allocateImage (int outputWidth, int outputHeight, AVPixelFormat outputFormat)
 
bool checkException (const QString &title)
 
bool checkObject (const QString &title, QJniObject &obj)
 
bool checkResult (const QString &title, int result)
 
void clearEncoder ()
 
 Context (QString *outErrorMessage=nullptr)
 
QJniObject & encoder ()
 
QJniEnvironment & env ()
 
SwsContext * getSwsContextFor (int inputWidth, int inputHeight, AVPixelFormat inputFormat, int outputWidth, int outputHeight, AVPixelFormat outputFormat, int flags)
 
uint8_t ** imageBuffers ()
 
int imageFormat () const
 
int * imageLinesizes ()
 
void setEncoder (const QJniObject &encoder)
 
void setInternalErrorMessage (const QString &detail)
 
 ~Context ()
 

Static Private Member Functions

static bool isErrorResult (int result)
 

Private Attributes

QJniObject m_encoder
 
QJniEnvironment m_env
 
uint8_t * m_imageBuffers [4] = {nullptr, nullptr, nullptr, nullptr}
 
AVPixelFormat m_imageFormat = AV_PIX_FMT_NONE
 
int m_imageLinesizes [4] = {0, 0, 0, 0}
 
QString * m_outErrorMessage
 
SwsContext * m_swsContext = nullptr
 

Detailed Description

Definition at line 213 of file KisAndroidMediaEncoderRunnable.cpp.

Constructor & Destructor Documentation

◆ Context()

KisAndroidMediaEncoderRunnable::Context::Context ( QString * outErrorMessage = nullptr)
inlineexplicit

Definition at line 216 of file KisAndroidMediaEncoderRunnable.cpp.

217 : m_outErrorMessage(outErrorMessage)
218 {
219 }

◆ ~Context()

KisAndroidMediaEncoderRunnable::Context::~Context ( )
inline

Member Function Documentation

◆ allocateImage()

bool KisAndroidMediaEncoderRunnable::Context::allocateImage ( int outputWidth,
int outputHeight,
AVPixelFormat outputFormat )
inline

Definition at line 342 of file KisAndroidMediaEncoderRunnable.cpp.

343 {
344 // The Android encoder really shouldn't be changing
345 // pixel formats along the way, but just in case.
346 if (m_imageFormat != AV_PIX_FMT_NONE) {
347 m_imageFormat = AV_PIX_FMT_NONE;
348 av_freep(&m_imageBuffers[0]);
349 }
350
351 int result = av_image_alloc(m_imageBuffers, m_imageLinesizes, outputWidth, outputHeight, outputFormat, 32);
352 if (result >= 0) {
353 m_imageFormat = outputFormat;
354 return true;
355 } else {
356 setInternalErrorMessage(QStringLiteral("av_image_alloc error %1").arg(result));
357 return false;
358 }
359 }

References m_imageBuffers, m_imageFormat, m_imageLinesizes, and setInternalErrorMessage().

◆ checkException()

bool KisAndroidMediaEncoderRunnable::Context::checkException ( const QString & title)
inline

Definition at line 294 of file KisAndroidMediaEncoderRunnable.cpp.

295 {
296 if (m_env->ExceptionCheck()) {
297 setInternalErrorMessage(QStringLiteral("JNI exception in %1").arg(title));
298 m_env->ExceptionDescribe();
299 m_env->ExceptionClear();
300 return true;
301 } else {
302 return false;
303 }
304 }

References m_env, and setInternalErrorMessage().

◆ checkObject()

bool KisAndroidMediaEncoderRunnable::Context::checkObject ( const QString & title,
QJniObject & obj )
inline

Definition at line 258 of file KisAndroidMediaEncoderRunnable.cpp.

259 {
260 if (checkException(title)) {
261 return true;
262 } else if (!obj.isValid()) {
263 setInternalErrorMessage(QStringLiteral("JNI object %1 invalid").arg(title));
264 return true;
265 } else {
266 return false;
267 }
268 }

References checkException(), and setInternalErrorMessage().

◆ checkResult()

bool KisAndroidMediaEncoderRunnable::Context::checkResult ( const QString & title,
int result )
inline

Definition at line 270 of file KisAndroidMediaEncoderRunnable.cpp.

271 {
272 if (checkException(title)) {
273 return true;
274 } else if (result == STATUS_ERROR_START_ENCODER) {
275 warnFile << "Start encoder error" << result;
276 if (m_outErrorMessage) {
277 *m_outErrorMessage = i18n("Unsupported video parameters, try lowering the video FPS or size");
278 }
279 return true;
280 } else if (result == STATUS_ERROR_DRAIN_MUXER_ADD_TRACK) {
281 warnFile << "Muxer track error" << result;
282 if (m_outErrorMessage) {
283 *m_outErrorMessage = i18n("Unsupported format");
284 }
285 return true;
286 } else if (isErrorResult(result)) {
287 setInternalErrorMessage(QStringLiteral("%1 failed with code %2").arg(title).arg(result));
288 return true;
289 } else {
290 return false;
291 }
292 }
#define warnFile
Definition kis_debug.h:95

References checkException(), isErrorResult(), m_outErrorMessage, setInternalErrorMessage(), KisAndroidMediaEncoderRunnable::STATUS_ERROR_DRAIN_MUXER_ADD_TRACK, KisAndroidMediaEncoderRunnable::STATUS_ERROR_START_ENCODER, and warnFile.

◆ clearEncoder()

void KisAndroidMediaEncoderRunnable::Context::clearEncoder ( )
inline

Definition at line 245 of file KisAndroidMediaEncoderRunnable.cpp.

246 {
247 if (m_encoder.isValid()) {
248 m_encoder.callMethod<void>("cancel", "()V");
249 m_encoder = QJniObject();
250 if (m_env->ExceptionCheck()) {
251 warnFile << "JNI exception occurred cancelling encoder";
252 m_env->ExceptionDescribe();
253 m_env->ExceptionClear();
254 }
255 }
256 }

References m_encoder, m_env, and warnFile.

◆ encoder()

QJniObject & KisAndroidMediaEncoderRunnable::Context::encoder ( )
inline

Definition at line 235 of file KisAndroidMediaEncoderRunnable.cpp.

236 {
237 return m_encoder;
238 }

References m_encoder.

◆ env()

QJniEnvironment & KisAndroidMediaEncoderRunnable::Context::env ( )
inline

Definition at line 230 of file KisAndroidMediaEncoderRunnable.cpp.

231 {
232 return m_env;
233 }

References m_env.

◆ getSwsContextFor()

SwsContext * KisAndroidMediaEncoderRunnable::Context::getSwsContextFor ( int inputWidth,
int inputHeight,
AVPixelFormat inputFormat,
int outputWidth,
int outputHeight,
AVPixelFormat outputFormat,
int flags )
inline

Definition at line 306 of file KisAndroidMediaEncoderRunnable.cpp.

313 {
314 return sws_getCachedContext(m_swsContext,
315 inputWidth,
316 inputHeight,
317 inputFormat,
318 outputWidth,
319 outputHeight,
320 outputFormat,
321 flags,
322 nullptr,
323 nullptr,
324 nullptr);
325 }

References m_swsContext.

◆ imageBuffers()

uint8_t ** KisAndroidMediaEncoderRunnable::Context::imageBuffers ( )
inline

Definition at line 332 of file KisAndroidMediaEncoderRunnable.cpp.

333 {
334 return m_imageBuffers;
335 }

References m_imageBuffers.

◆ imageFormat()

int KisAndroidMediaEncoderRunnable::Context::imageFormat ( ) const
inline

Definition at line 327 of file KisAndroidMediaEncoderRunnable.cpp.

328 {
329 return m_imageFormat;
330 }

References m_imageFormat.

◆ imageLinesizes()

int * KisAndroidMediaEncoderRunnable::Context::imageLinesizes ( )
inline

Definition at line 337 of file KisAndroidMediaEncoderRunnable.cpp.

338 {
339 return m_imageLinesizes;
340 }

References m_imageLinesizes.

◆ isErrorResult()

static bool KisAndroidMediaEncoderRunnable::Context::isErrorResult ( int result)
inlinestaticprivate

Definition at line 372 of file KisAndroidMediaEncoderRunnable.cpp.

373 {
374 return result >= 100;
375 }

◆ setEncoder()

void KisAndroidMediaEncoderRunnable::Context::setEncoder ( const QJniObject & encoder)
inline

Definition at line 240 of file KisAndroidMediaEncoderRunnable.cpp.

References encoder(), and m_encoder.

◆ setInternalErrorMessage()

void KisAndroidMediaEncoderRunnable::Context::setInternalErrorMessage ( const QString & detail)
inline

Definition at line 361 of file KisAndroidMediaEncoderRunnable.cpp.

362 {
363 warnFile << "Media encoder error:" << detail;
364 if (m_outErrorMessage) {
365 // Internal encoder errors are only really useful for developers,
366 // so there's no point in translating them.
367 *m_outErrorMessage = i18n("Internal error (%1)", detail);
368 }
369 }

References m_outErrorMessage, and warnFile.

Member Data Documentation

◆ m_encoder

QJniObject KisAndroidMediaEncoderRunnable::Context::m_encoder
private

Definition at line 378 of file KisAndroidMediaEncoderRunnable.cpp.

◆ m_env

QJniEnvironment KisAndroidMediaEncoderRunnable::Context::m_env
private

Definition at line 377 of file KisAndroidMediaEncoderRunnable.cpp.

◆ m_imageBuffers

uint8_t* KisAndroidMediaEncoderRunnable::Context::m_imageBuffers[4] = {nullptr, nullptr, nullptr, nullptr}
private

Definition at line 381 of file KisAndroidMediaEncoderRunnable.cpp.

381{nullptr, nullptr, nullptr, nullptr};

◆ m_imageFormat

AVPixelFormat KisAndroidMediaEncoderRunnable::Context::m_imageFormat = AV_PIX_FMT_NONE
private

Definition at line 383 of file KisAndroidMediaEncoderRunnable.cpp.

◆ m_imageLinesizes

int KisAndroidMediaEncoderRunnable::Context::m_imageLinesizes[4] = {0, 0, 0, 0}
private

Definition at line 382 of file KisAndroidMediaEncoderRunnable.cpp.

382{0, 0, 0, 0};

◆ m_outErrorMessage

QString* KisAndroidMediaEncoderRunnable::Context::m_outErrorMessage
private

Definition at line 379 of file KisAndroidMediaEncoderRunnable.cpp.

◆ m_swsContext

SwsContext* KisAndroidMediaEncoderRunnable::Context::m_swsContext = nullptr
private

Definition at line 380 of file KisAndroidMediaEncoderRunnable.cpp.


The documentation for this class was generated from the following file: