void initiateConfigureComponent(const sp<AMessage> &msg);
void initiateStart();
+ void signalRequestIDRFrame();
+
struct PortDescription : public RefBase {
size_t countBuffers();
IOMX::buffer_id bufferIDAt(size_t index) const;
kWhatAllocateComponent = 'allo',
kWhatConfigureComponent = 'conf',
kWhatStart = 'star',
+ kWhatRequestIDRFrame = 'ridr',
};
enum {
OMX_ERRORTYPE error = OMX_ErrorUndefined,
status_t internalError = UNKNOWN_ERROR);
+ status_t requestIDRFrame();
+
DISALLOW_EVIL_CONSTRUCTORS(ACodec);
};
status_t getInputBuffers(Vector<sp<ABuffer> > *buffers) const;
status_t getOutputBuffers(Vector<sp<ABuffer> > *buffers) const;
+ status_t requestIDRFrame();
+
protected:
virtual ~MediaCodec();
virtual void onMessageReceived(const sp<AMessage> &msg);
kWhatDequeueInputTimedOut = 'dITO',
kWhatDequeueOutputTimedOut = 'dOTO',
kWhatCodecNotify = 'codc',
+ kWhatRequestIDRFrame = 'ridr',
};
enum {
#include <OMX_Component.h>
+#include "include/avc_utils.h"
+
namespace android {
template<class T>
msg->post();
}
+void ACodec::signalRequestIDRFrame() {
+ (new AMessage(kWhatRequestIDRFrame, id()))->post();
+}
+
status_t ACodec::allocateBuffersOnPort(OMX_U32 portIndex) {
CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput);
ACodec::PortDescription::PortDescription() {
}
+status_t ACodec::requestIDRFrame() {
+ if (!mIsEncoder) {
+ return ERROR_UNSUPPORTED;
+ }
+
+ OMX_CONFIG_INTRAREFRESHVOPTYPE params;
+ InitOMXParams(¶ms);
+
+ params.nPortIndex = kPortIndexOutput;
+ params.IntraRefreshVOP = OMX_TRUE;
+
+ return mOMX->setConfig(
+ mNode,
+ OMX_IndexConfigVideoIntraVOPRefresh,
+ ¶ms,
+ sizeof(params));
+}
+
void ACodec::PortDescription::addBuffer(
IOMX::buffer_id id, const sp<ABuffer> &buffer) {
mBufferIDs.push_back(id);
if (mCodec->mNativeWindow == NULL) {
info->mData->setRange(rangeOffset, rangeLength);
+
+#if 0
+ if (IsIDR(info->mData)) {
+ ALOGI("IDR frame");
+ }
+#endif
}
if (mCodec->mSkipCutBuffer != NULL) {
break;
}
+ case kWhatRequestIDRFrame:
+ {
+ status_t err = mCodec->requestIDRFrame();
+ if (err != OK) {
+ ALOGW("Requesting an IDR frame failed.");
+ }
+
+ handled = true;
+ break;
+ }
+
default:
handled = BaseState::onMessageReceived(msg);
break;
return PostAndAwaitResponse(msg, &response);
}
+status_t MediaCodec::requestIDRFrame() {
+ (new AMessage(kWhatRequestIDRFrame, id()))->post();
+
+ return OK;
+}
+
////////////////////////////////////////////////////////////////////////////////
void MediaCodec::cancelPendingDequeueOperations() {
break;
}
+ case kWhatRequestIDRFrame:
+ {
+ mCodec->signalRequestIDRFrame();
+ break;
+ }
+
default:
TRESPASS();
}
mNotify(notify),
mCodecLooper(codecLooper),
mInputFormat(format),
+ mIsVideo(false),
mDoMoreWorkPending(false) {
+ AString mime;
+ CHECK(mInputFormat->findString("mime", &mime));
+
+ if (!strncasecmp("video/", mime.c_str(), 6)) {
+ mIsVideo = true;
+ }
+
mInitCheck = initEncoder();
}
break;
}
+ case kWhatRequestIDRFrame:
+ {
+ if (mIsVideo) {
+ ALOGI("requesting IDR frame");
+ mEncoder->requestIDRFrame();
+ }
+ break;
+ }
+
default:
TRESPASS();
}
return err;
}
+void Converter::requestIDRFrame() {
+ (new AMessage(kWhatRequestIDRFrame, id()))->post();
+}
+
} // namespace android
void feedAccessUnit(const sp<ABuffer> &accessUnit);
void signalEOS();
+ void requestIDRFrame();
+
enum {
kWhatAccessUnit,
kWhatEOS,
enum {
kWhatFeedAccessUnit,
kWhatInputEOS,
- kWhatDoMoreWork
+ kWhatDoMoreWork,
+ kWhatRequestIDRFrame,
};
status_t mInitCheck;
sp<AMessage> mNotify;
sp<ALooper> mCodecLooper;
sp<AMessage> mInputFormat;
+ bool mIsVideo;
sp<AMessage> mOutputFormat;
sp<MediaCodec> mEncoder;
return OK;
}
+void WifiDisplaySource::PlaybackSession::requestIDRFrame() {
+ for (size_t i = 0; i < mTracks.size(); ++i) {
+ const sp<Track> &track = mTracks.valueAt(i);
+
+ track->converter()->requestIDRFrame();
+ }
+}
+
} // namespace android
int32_t width() const;
int32_t height() const;
+ void requestIDRFrame();
+
enum {
kWhatSessionDead,
kWhatBinaryData,
}
#endif
+ // XXX check that the parameter is about that.
+ playbackSession->requestIDRFrame();
+
playbackSession->updateLiveness();
AString response = "RTSP/1.0 200 OK\r\n";