void VideoConsumer::Disconnected(const media_source& producer, const media_destination& where) { FUNCTION("VideoConsumer::Disconnected\n"); if (where != fIn.destination || producer != fIn.source) return; // reclaim our buffers int32 changeTag = 0; SetOutputBuffersFor(producer, fIn.destination, NULL, NULL, &changeTag, false); if (fOurBuffers) { status_t reclaimError = fBuffers->ReclaimAllBuffers(); if (reclaimError != B_OK) { fprintf(stderr, "VideoConsumer::Disconnected() - Failed to " "reclaim our buffers: %s\n", strerror(reclaimError)); } } // disconnect the connection fIn.source = media_source::null; fConnectionActive = false; // Unset the target's bitmap. Just to be safe -- since it is usually // done when the stop event arrives, but someone may disonnect // without stopping us before. _UnsetTargetBuffer(); }
status_t EqualizerNode::SetBufferGroup(const media_source &src, BBufferGroup* group) { int32 changeTag; status_t ret = B_OK; if (src != fOutputMedia.source) return B_MEDIA_BAD_SOURCE; if (fInputMedia.source == media_source::null) return B_ERROR; ret = SetOutputBuffersFor(fInputMedia.source, fInputMedia.destination, group, 0, &changeTag); return ret; }
status_t FlipTransition::SetBufferGroup(const media_source& source, BBufferGroup* pGroup) { PRINT(("FlipTransition::SetBufferGroup()\n")); if (source != m_output.source) { PRINT(("\tBad source.\n")); return B_MEDIA_BAD_SOURCE; } if (first_input.source == media_source::null) { PRINT(("\tNo producer to send buffers to.\n")); return B_ERROR; } // +++++ is this right? buffer-group selection gets // all asynchronous and weird... int32 changeTag; return SetOutputBuffersFor(first_input.source, first_input.destination, pGroup, 0, &changeTag); }
status_t VideoConsumer::Connected(const media_source& producer, const media_destination& where, const media_format& format, media_input* outInput) { FUNCTION("VideoConsumer::Connected\n"); fIn.source = producer; fIn.format = format; fIn.node = Node(); sprintf(fIn.name, "Video Consumer"); *outInput = fIn; uint32 userData = 0; int32 changeTag = 1; status_t ret = CreateBuffers(format); if (ret == B_OK) { // TODO: With overlay bitmaps, there seems to be a problem with // mapping the BBitmap areas into the BBuffers. Until that is fixed, // don't enable a shared BBufferGroup. if (!fTryOverlay) { ret = SetOutputBuffersFor(producer, fIn.destination, fBuffers, &userData, &changeTag, true); if (ret != B_OK) ERROR("SetOutputBuffersFor() failed: %s\n", strerror(ret)); } fIn.format.u.raw_video.display.bytes_per_row = fBitmap[0]->BytesPerRow(); } else { ERROR("VideoConsumer::Connected - COULDN'T CREATE BUFFERS\n"); return ret; } *outInput = fIn; // bytes per row might have changed fConnectionActive = true; FUNCTION("VideoConsumer::Connected - EXIT\n"); return B_OK; }