mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-12-16 08:56:45 -05:00
bluez5: use start_decode to skip the header
This commit is contained in:
parent
3c2ab98a2a
commit
3363544d05
3 changed files with 26 additions and 8 deletions
|
|
@ -382,6 +382,21 @@ static int codec_encode(void *data,
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int codec_start_decode (void *data,
|
||||||
|
const void *src, size_t src_size, uint16_t *seqnum, uint32_t *timestamp)
|
||||||
|
{
|
||||||
|
const struct rtp_header *header = src;
|
||||||
|
size_t header_size = sizeof(struct rtp_header) + sizeof(struct rtp_payload);
|
||||||
|
|
||||||
|
spa_return_val_if_fail (src_size > header_size, -EINVAL);
|
||||||
|
|
||||||
|
if (seqnum)
|
||||||
|
*seqnum = ntohs(header->sequence_number);
|
||||||
|
if (timestamp)
|
||||||
|
*timestamp = ntohl(header->timestamp);
|
||||||
|
return header_size;
|
||||||
|
}
|
||||||
|
|
||||||
static int codec_decode(void *data,
|
static int codec_decode(void *data,
|
||||||
const void *src, size_t src_size,
|
const void *src, size_t src_size,
|
||||||
void *dst, size_t dst_size,
|
void *dst, size_t dst_size,
|
||||||
|
|
@ -408,6 +423,7 @@ struct a2dp_codec a2dp_codec_sbc = {
|
||||||
.get_num_blocks = codec_get_num_blocks,
|
.get_num_blocks = codec_get_num_blocks,
|
||||||
.start_encode = codec_start_encode,
|
.start_encode = codec_start_encode,
|
||||||
.encode = codec_encode,
|
.encode = codec_encode,
|
||||||
|
.start_decode = codec_start_decode,
|
||||||
.decode = codec_decode,
|
.decode = codec_decode,
|
||||||
.reduce_bitpool = codec_reduce_bitpool,
|
.reduce_bitpool = codec_reduce_bitpool,
|
||||||
.increase_bitpool = codec_increase_bitpool,
|
.increase_bitpool = codec_increase_bitpool,
|
||||||
|
|
|
||||||
|
|
@ -342,6 +342,8 @@ struct a2dp_codec {
|
||||||
void *dst, size_t dst_size,
|
void *dst, size_t dst_size,
|
||||||
size_t *dst_out);
|
size_t *dst_out);
|
||||||
|
|
||||||
|
int (*start_decode) (void *data,
|
||||||
|
const void *src, size_t src_size, uint16_t *seqnum, uint32_t *timestamp);
|
||||||
int (*decode) (void *data,
|
int (*decode) (void *data,
|
||||||
const void *src, size_t src_size,
|
const void *src, size_t src_size,
|
||||||
void *dst, size_t dst_size,
|
void *dst, size_t dst_size,
|
||||||
|
|
|
||||||
|
|
@ -345,21 +345,21 @@ again:
|
||||||
static int32_t decode_data(struct impl *this, uint8_t *src, uint32_t src_size,
|
static int32_t decode_data(struct impl *this, uint8_t *src, uint32_t src_size,
|
||||||
uint8_t *dst, uint32_t dst_size)
|
uint8_t *dst, uint32_t dst_size)
|
||||||
{
|
{
|
||||||
const uint32_t header_size = sizeof(struct rtp_header) + sizeof(struct rtp_payload);
|
|
||||||
ssize_t processed;
|
ssize_t processed;
|
||||||
size_t written, avail;
|
size_t written, avail;
|
||||||
|
|
||||||
/* skip the header */
|
if ((processed = this->codec->start_decode(this->codec_data,
|
||||||
spa_return_val_if_fail (src_size > header_size, -EINVAL);
|
src, src_size, NULL, NULL)) < 0)
|
||||||
src += header_size;
|
return processed;
|
||||||
src_size -= header_size;
|
|
||||||
|
src += processed;
|
||||||
|
src_size -= processed;
|
||||||
|
|
||||||
/* decode */
|
/* decode */
|
||||||
avail = dst_size;
|
avail = dst_size;
|
||||||
while (src_size > 0) {
|
while (src_size > 0) {
|
||||||
processed = this->codec->decode(this->codec_data,
|
if ((processed = this->codec->decode(this->codec_data,
|
||||||
src, src_size, dst, avail, &written);
|
src, src_size, dst, avail, &written)) <= 0)
|
||||||
if (processed <= 0)
|
|
||||||
return processed;
|
return processed;
|
||||||
|
|
||||||
/* update source and dest pointers */
|
/* update source and dest pointers */
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue