AVCodecEncoder::~AVCodecEncoder() { TRACE("AVCodecEncoder::~AVCodecEncoder()\n"); _CloseCodecIfNeeded(); if (fSwsContext != NULL) sws_freeContext(fSwsContext); av_fifo_free(fAudioFifo); avpicture_free(&fDstFrame); // NOTE: Do not use avpicture_free() on fSrcFrame!! We fill the picture // data on the fly with the media buffer data passed to Encode(). if (fFrame != NULL) { fFrame->data[0] = NULL; fFrame->data[1] = NULL; fFrame->data[2] = NULL; fFrame->data[3] = NULL; fFrame->linesize[0] = 0; fFrame->linesize[1] = 0; fFrame->linesize[2] = 0; fFrame->linesize[3] = 0; free(fFrame); } free(fOwnContext); delete[] fChunkBuffer; }
status_t AVCodecEncoder::SetUp(const media_format* inputFormat) { TRACE("AVCodecEncoder::SetUp()\n"); if (fContext == NULL) return B_NO_INIT; if (inputFormat == NULL) return B_BAD_VALUE; // Codec IDs for raw-formats may need to be figured out here. if (fCodec == NULL && fCodecID == CODEC_ID_NONE) { fCodecID = raw_audio_codec_id_for(*inputFormat); if (fCodecID != CODEC_ID_NONE) fCodec = avcodec_find_encoder(fCodecID); } if (fCodec == NULL) { TRACE(" encoder not found!\n"); return B_NO_INIT; } _CloseCodecIfNeeded(); fInputFormat = *inputFormat; fFramesWritten = 0; const uchar* userData = inputFormat->user_data; if (*(uint32*)userData == 'ffmp') { userData += sizeof(uint32); // The Writer plugin used is the FFmpeg plugin. It stores the // AVCodecContext pointer in the user data section. Use this // context instead of our own. It requires the Writer living in // the same team, of course. app_info appInfo; if (be_app->GetAppInfo(&appInfo) == B_OK && *(team_id*)userData == appInfo.team) { userData += sizeof(team_id); // Use the AVCodecContext from the Writer. This works better // than using our own context with some encoders. fContext = *(AVCodecContext**)userData; } } return _Setup(); }
status_t AVCodecEncoder::SetUp(const media_format* inputFormat) { TRACE("AVCodecEncoder::SetUp()\n"); if (fContext == NULL || fCodec == NULL) return B_NO_INIT; if (inputFormat == NULL) return B_BAD_VALUE; _CloseCodecIfNeeded(); fInputFormat = *inputFormat; fFramesWritten = 0; return _Setup(); }