mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
UniquePtr: Support SrsUniquePtr to replace SrsAutoFree. v6.0.136 (#4109)
To manage an object: ```cpp // Before MyClass* ptr = new MyClass(); SrsAutoFree(MyClass, ptr); ptr->do_something(); // Now SrsUniquePtr<MyClass> ptr(new MyClass()); ptr->do_something(); ``` To manage an array of objects: ```cpp // Before char* ptr = new char[10]; SrsAutoFreeA(char, ptr); ptr[0] = 0xf; // Now SrsUniquePtr<char[]> ptr(new char[10]); ptr[0] = 0xf; ``` In fact, SrsUniquePtr is a limited subset of SrsAutoFree, mainly managing pointers and arrays. SrsUniquePtr is better than SrsAutoFree because it has the same API to standard unique ptr. ```cpp SrsUniquePtr<MyClass> ptr(new MyClass()); ptr->do_something(); MyClass* p = ptr.get(); ``` SrsAutoFree actually uses a pointer to a pointer, so it can be set to NULL, allowing the pointer's value to be changed later (this usage is different from SrsUniquePtr). ```cpp // OK to free ptr correctly. MyClass* ptr; SrsAutoFree(MyClass, ptr); ptr = new MyClass(); // Crash because ptr is an invalid pointer. MyClass* ptr; SrsUniquePtr<MyClass> ptr(ptr); ptr = new MyClass(); ``` Additionally, SrsAutoFreeH can use specific release functions, which SrsUniquePtr does not support. --------- Co-authored-by: Jacob Su <suzp1984@gmail.com>
This commit is contained in:
parent
baf22d01c1
commit
23d2602c34
72 changed files with 1720 additions and 1669 deletions
|
|
@ -730,13 +730,12 @@ srs_error_t SrsVideoFrame::parse_avc_b_frame(const SrsSample* sample, bool& is_b
|
|||
return err;
|
||||
}
|
||||
|
||||
SrsBuffer* stream = new SrsBuffer(sample->bytes, sample->size);
|
||||
SrsAutoFree(SrsBuffer, stream);
|
||||
SrsUniquePtr<SrsBuffer> stream(new SrsBuffer(sample->bytes, sample->size));
|
||||
|
||||
// Skip nalu header.
|
||||
stream->skip(1);
|
||||
|
||||
SrsBitBuffer bitstream(stream);
|
||||
SrsBitBuffer bitstream(stream.get());
|
||||
int32_t first_mb_in_slice = 0;
|
||||
if ((err = srs_avc_nalu_read_uev(&bitstream, first_mb_in_slice)) != srs_success) {
|
||||
return srs_error_wrap(err, "nalu read uev");
|
||||
|
|
@ -793,10 +792,9 @@ srs_error_t SrsFormat::on_audio(int64_t timestamp, char* data, int size)
|
|||
srs_info("no audio present, ignore it.");
|
||||
return err;
|
||||
}
|
||||
|
||||
SrsBuffer* buffer = new SrsBuffer(data, size);
|
||||
SrsAutoFree(SrsBuffer, buffer);
|
||||
|
||||
|
||||
SrsUniquePtr<SrsBuffer> buffer(new SrsBuffer(data, size));
|
||||
|
||||
// We already checked the size is positive and data is not NULL.
|
||||
srs_assert(buffer->require(1));
|
||||
|
||||
|
|
@ -824,10 +822,10 @@ srs_error_t SrsFormat::on_audio(int64_t timestamp, char* data, int size)
|
|||
buffer->skip(-1 * buffer->pos());
|
||||
|
||||
if (codec == SrsAudioCodecIdMP3) {
|
||||
return audio_mp3_demux(buffer, timestamp, fresh);
|
||||
return audio_mp3_demux(buffer.get(), timestamp, fresh);
|
||||
}
|
||||
|
||||
return audio_aac_demux(buffer, timestamp);
|
||||
return audio_aac_demux(buffer.get(), timestamp);
|
||||
}
|
||||
|
||||
srs_error_t SrsFormat::on_video(int64_t timestamp, char* data, int size)
|
||||
|
|
@ -838,11 +836,9 @@ srs_error_t SrsFormat::on_video(int64_t timestamp, char* data, int size)
|
|||
srs_trace("no video present, ignore it.");
|
||||
return err;
|
||||
}
|
||||
|
||||
SrsBuffer* buffer = new SrsBuffer(data, size);
|
||||
SrsAutoFree(SrsBuffer, buffer);
|
||||
|
||||
return video_avc_demux(buffer, timestamp);
|
||||
SrsUniquePtr<SrsBuffer> buffer(new SrsBuffer(data, size));
|
||||
return video_avc_demux(buffer.get(), timestamp);
|
||||
}
|
||||
|
||||
srs_error_t SrsFormat::on_aac_sequence_header(char* data, int size)
|
||||
|
|
@ -2807,10 +2803,9 @@ srs_error_t SrsFormat::audio_mp3_demux(SrsBuffer* stream, int64_t timestamp, boo
|
|||
srs_error_t SrsFormat::audio_aac_sequence_header_demux(char* data, int size)
|
||||
{
|
||||
srs_error_t err = srs_success;
|
||||
|
||||
SrsBuffer* buffer = new SrsBuffer(data, size);
|
||||
SrsAutoFree(SrsBuffer, buffer);
|
||||
|
||||
|
||||
SrsUniquePtr<SrsBuffer> buffer(new SrsBuffer(data, size));
|
||||
|
||||
// only need to decode the first 2bytes:
|
||||
// audioObjectType, aac_profile, 5bits.
|
||||
// samplingFrequencyIndex, aac_sample_rate, 4bits.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue