Skip to content

Commit aad142e

Browse files
committed
Cleanup BSF logic
1 parent 0ad7370 commit aad142e

File tree

4 files changed

+22
-29
lines changed

4 files changed

+22
-29
lines changed

src/torchcodec/_core/BetaCudaDeviceInterface.cpp

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,8 @@ int BetaCudaDeviceInterface::sendPacket(ReferenceAVPacket& packet) {
252252
CUVIDSOURCEDATAPACKET cuvidPacket = {};
253253

254254
if (packet.get() && packet->data && packet->size > 0) {
255+
applyBSF(packet);
256+
255257
// Regular packet with data
256258
cuvidPacket.payload = packet->data;
257259
cuvidPacket.payload_size = packet->size;
@@ -275,27 +277,36 @@ int BetaCudaDeviceInterface::sendPacket(ReferenceAVPacket& packet) {
275277
return AVSUCCESS;
276278
}
277279

278-
// TODONVDEC P0: cleanup this raw pointer / reference monstruosity.
279-
ReferenceAVPacket* BetaCudaDeviceInterface::applyBSF(
280-
ReferenceAVPacket& packet,
281-
[[maybe_unused]] AutoAVPacket& filteredAutoPacket,
282-
ReferenceAVPacket& filteredPacket) {
280+
void BetaCudaDeviceInterface::applyBSF(ReferenceAVPacket& packet) {
283281
if (!bitstreamFilter_) {
284-
return &packet;
282+
return;
285283
}
284+
286285
int retVal = av_bsf_send_packet(bitstreamFilter_.get(), packet.get());
287286
TORCH_CHECK(
288287
retVal >= AVSUCCESS,
289288
"Failed to send packet to bitstream filter: ",
290289
getFFMPEGErrorStringFromErrorCode(retVal));
291290

291+
// Create a temporary packet to receive the filtered data
292+
// TODO P1: the docs mention there can theoretically be multiple output
293+
// packets for a single input, i.e. we may need to call av_bsf_receive_packet
294+
// more than once. We should figure out whether that applies to the BSF we're
295+
// using.
296+
AutoAVPacket filteredAutoPacket;
297+
ReferenceAVPacket filteredPacket(filteredAutoPacket);
292298
retVal = av_bsf_receive_packet(bitstreamFilter_.get(), filteredPacket.get());
293299
TORCH_CHECK(
294300
retVal >= AVSUCCESS,
295301
"Failed to receive packet from bitstream filter: ",
296302
getFFMPEGErrorStringFromErrorCode(retVal));
297303

298-
return &filteredPacket;
304+
// Free the original packet's data which isn't needed anymore, and move the
305+
// fields of the filtered packet into the original packet. The filtered packet
306+
// fields are re-set by av_packet_move_ref, so when it goes out of scope and
307+
// gets destructed, it's not going to affect the original packet.
308+
av_packet_unref(packet.get());
309+
av_packet_move_ref(packet.get(), filteredPacket.get());
299310
}
300311

301312
// Parser triggers this callback within cuvidParseVideoData when a frame is

src/torchcodec/_core/BetaCudaDeviceInterface.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,16 +54,15 @@ class BetaCudaDeviceInterface : public DeviceInterface {
5454
int sendPacket(ReferenceAVPacket& packet) override;
5555
int receiveFrame(UniqueAVFrame& avFrame, int64_t desiredPts) override;
5656
void flush() override;
57-
ReferenceAVPacket* applyBSF(
58-
ReferenceAVPacket& packet,
59-
AutoAVPacket& filteredAutoPacket,
60-
ReferenceAVPacket& filteredPacket) override;
6157

6258
// NVDEC callback functions (must be public for C callbacks)
6359
unsigned char streamPropertyChange(CUVIDEOFORMAT* videoFormat);
6460
int frameReadyForDecoding(CUVIDPICPARAMS* pPicParams);
6561

6662
private:
63+
// Apply bitstream filter, modifies packet in-place
64+
void applyBSF(ReferenceAVPacket& packet);
65+
6766
class FrameBuffer {
6867
public:
6968
struct Slot {

src/torchcodec/_core/DeviceInterface.h

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -102,15 +102,6 @@ class DeviceInterface {
102102
// Custom decoders can override this method
103103
}
104104

105-
// Apply bitstream filter if needed, returns pointer to packet to use
106-
// Default implementation returns the original packet (no filtering)
107-
virtual ReferenceAVPacket* applyBSF(
108-
ReferenceAVPacket& packet,
109-
[[maybe_unused]] AutoAVPacket& filteredAutoPacket,
110-
[[maybe_unused]] ReferenceAVPacket& filteredPacket) {
111-
return &packet; // No filtering by default
112-
}
113-
114105
protected:
115106
torch::Device device_;
116107
};

src/torchcodec/_core/SingleStreamDecoder.cpp

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1222,15 +1222,7 @@ UniqueAVFrame SingleStreamDecoder::decodeAVFrame(
12221222
// We got a valid packet. Send it to the decoder, and we'll receive it in
12231223
// the next iteration.
12241224
if (useCustomInterface) {
1225-
// TODONVDEC P0:
1226-
// - cleanup this raw pointer / reference monstruosity.
1227-
// - don't even expose applyBSF in the interface. This should just be part
1228-
// of sendPacket().
1229-
AutoAVPacket filteredAutoPacket;
1230-
ReferenceAVPacket filteredPacket(filteredAutoPacket);
1231-
ReferenceAVPacket* packetToSend = deviceInterface_->applyBSF(
1232-
packet, filteredAutoPacket, filteredPacket);
1233-
status = deviceInterface_->sendPacket(*packetToSend);
1225+
status = deviceInterface_->sendPacket(packet);
12341226
} else {
12351227
status = avcodec_send_packet(streamInfo.codecContext.get(), packet.get());
12361228
}

0 commit comments

Comments
 (0)