diff mbox

[FFmpeg-devel,1/2] avocdec/ttaenc: buffer packets directly

Message ID 20171120204456.804-1-jamrial@gmail.com
State Accepted
Commit e97667c82f4c3ed813269383f8ea825ffb96204f
Headers show

Commit Message

James Almer Nov. 20, 2017, 8:44 p.m. UTC
This is a bit more robust in case of OOM.

Signed-off-by: James Almer <jamrial@gmail.com>
---
 libavformat/ttaenc.c | 42 +++++++++++++++++++++++++++++++++---------
 1 file changed, 33 insertions(+), 9 deletions(-)

Comments

James Almer Nov. 20, 2017, 10:35 p.m. UTC | #1
On 11/20/2017 5:44 PM, James Almer wrote:
> This is a bit more robust in case of OOM.
> 
> Signed-off-by: James Almer <jamrial@gmail.com>

Subject should be avformat, not avcodec. Fixed locally.
James Almer Nov. 23, 2017, 5 a.m. UTC | #2
On 11/20/2017 5:44 PM, James Almer wrote:
> This is a bit more robust in case of OOM.
> 
> Signed-off-by: James Almer <jamrial@gmail.com>
> ---
>  libavformat/ttaenc.c | 42 +++++++++++++++++++++++++++++++++---------
>  1 file changed, 33 insertions(+), 9 deletions(-)
> 
> diff --git a/libavformat/ttaenc.c b/libavformat/ttaenc.c
> index fdce1e3dc1..b05705b6b6 100644
> --- a/libavformat/ttaenc.c
> +++ b/libavformat/ttaenc.c
> @@ -29,7 +29,7 @@
>  
>  typedef struct TTAMuxContext {
>      AVIOContext *seek_table;
> -    AVIOContext *data;
> +    AVPacketList *queue, *queue_end;
>      uint32_t nb_samples;
>      int frame_size;
>      int last_frame;
> @@ -56,10 +56,6 @@ static int tta_write_header(AVFormatContext *s)
>  
>      if ((ret = avio_open_dyn_buf(&tta->seek_table)) < 0)
>          return ret;
> -    if ((ret = avio_open_dyn_buf(&tta->data)) < 0) {
> -        ffio_free_dyn_buf(&tta->seek_table);
> -        return ret;
> -    }
>  
>      /* Ignore most extradata information if present. It can be innacurate
>         if for example remuxing from Matroska */
> @@ -84,8 +80,23 @@ static int tta_write_header(AVFormatContext *s)
>  static int tta_write_packet(AVFormatContext *s, AVPacket *pkt)
>  {
>      TTAMuxContext *tta = s->priv_data;
> +    AVPacketList *pktl = av_mallocz(sizeof(*pktl));
> +    int ret;
> +
> +    if (!pktl)
> +        return AVERROR(ENOMEM);
> +
> +    ret = av_packet_ref(&pktl->pkt, pkt);
> +    if (ret < 0) {
> +        av_free(pktl);
> +        return ret;
> +    }
> +    if (tta->queue_end)
> +        tta->queue_end->next = pktl;
> +    else
> +        tta->queue = pktl;
> +    tta->queue_end = pktl;
>  
> -    avio_write(tta->data, pkt->data, pkt->size);
>      avio_wl32(tta->seek_table, pkt->size);
>      tta->nb_samples += pkt->duration;
>  
> @@ -106,6 +117,21 @@ static int tta_write_packet(AVFormatContext *s, AVPacket *pkt)
>      return 0;
>  }
>  
> +static void tta_queue_flush(AVFormatContext *s)
> +{
> +    TTAMuxContext *tta = s->priv_data;
> +    AVPacketList *pktl;
> +
> +    while (pktl = tta->queue) {
> +        AVPacket *pkt = &pktl->pkt;
> +        avio_write(s->pb, pkt->data, pkt->size);
> +        av_packet_unref(pkt);
> +        tta->queue = pktl->next;
> +        av_free(pktl);
> +    }
> +    tta->queue_end = NULL;
> +}
> +
>  static int tta_write_trailer(AVFormatContext *s)
>  {
>      TTAMuxContext *tta = s->priv_data;
> @@ -125,9 +151,7 @@ static int tta_write_trailer(AVFormatContext *s)
>      av_free(ptr);
>  
>      /* Write audio data */
> -    size = avio_close_dyn_buf(tta->data, &ptr);
> -    avio_write(s->pb, ptr, size);
> -    av_free(ptr);
> +    tta_queue_flush(s);
>  
>      ff_ape_write_tag(s);
>      avio_flush(s->pb);

Ping.
James Almer Nov. 24, 2017, 6:06 p.m. UTC | #3
On 11/23/2017 2:00 AM, James Almer wrote:
> On 11/20/2017 5:44 PM, James Almer wrote:
>> This is a bit more robust in case of OOM.
>>
>> Signed-off-by: James Almer <jamrial@gmail.com>
>> ---
>>  libavformat/ttaenc.c | 42 +++++++++++++++++++++++++++++++++---------
>>  1 file changed, 33 insertions(+), 9 deletions(-)
>>
>> diff --git a/libavformat/ttaenc.c b/libavformat/ttaenc.c
>> index fdce1e3dc1..b05705b6b6 100644
>> --- a/libavformat/ttaenc.c
>> +++ b/libavformat/ttaenc.c
>> @@ -29,7 +29,7 @@
>>  
>>  typedef struct TTAMuxContext {
>>      AVIOContext *seek_table;
>> -    AVIOContext *data;
>> +    AVPacketList *queue, *queue_end;
>>      uint32_t nb_samples;
>>      int frame_size;
>>      int last_frame;
>> @@ -56,10 +56,6 @@ static int tta_write_header(AVFormatContext *s)
>>  
>>      if ((ret = avio_open_dyn_buf(&tta->seek_table)) < 0)
>>          return ret;
>> -    if ((ret = avio_open_dyn_buf(&tta->data)) < 0) {
>> -        ffio_free_dyn_buf(&tta->seek_table);
>> -        return ret;
>> -    }
>>  
>>      /* Ignore most extradata information if present. It can be innacurate
>>         if for example remuxing from Matroska */
>> @@ -84,8 +80,23 @@ static int tta_write_header(AVFormatContext *s)
>>  static int tta_write_packet(AVFormatContext *s, AVPacket *pkt)
>>  {
>>      TTAMuxContext *tta = s->priv_data;
>> +    AVPacketList *pktl = av_mallocz(sizeof(*pktl));
>> +    int ret;
>> +
>> +    if (!pktl)
>> +        return AVERROR(ENOMEM);
>> +
>> +    ret = av_packet_ref(&pktl->pkt, pkt);
>> +    if (ret < 0) {
>> +        av_free(pktl);
>> +        return ret;
>> +    }
>> +    if (tta->queue_end)
>> +        tta->queue_end->next = pktl;
>> +    else
>> +        tta->queue = pktl;
>> +    tta->queue_end = pktl;
>>  
>> -    avio_write(tta->data, pkt->data, pkt->size);
>>      avio_wl32(tta->seek_table, pkt->size);
>>      tta->nb_samples += pkt->duration;
>>  
>> @@ -106,6 +117,21 @@ static int tta_write_packet(AVFormatContext *s, AVPacket *pkt)
>>      return 0;
>>  }
>>  
>> +static void tta_queue_flush(AVFormatContext *s)
>> +{
>> +    TTAMuxContext *tta = s->priv_data;
>> +    AVPacketList *pktl;
>> +
>> +    while (pktl = tta->queue) {
>> +        AVPacket *pkt = &pktl->pkt;
>> +        avio_write(s->pb, pkt->data, pkt->size);
>> +        av_packet_unref(pkt);
>> +        tta->queue = pktl->next;
>> +        av_free(pktl);
>> +    }
>> +    tta->queue_end = NULL;
>> +}
>> +
>>  static int tta_write_trailer(AVFormatContext *s)
>>  {
>>      TTAMuxContext *tta = s->priv_data;
>> @@ -125,9 +151,7 @@ static int tta_write_trailer(AVFormatContext *s)
>>      av_free(ptr);
>>  
>>      /* Write audio data */
>> -    size = avio_close_dyn_buf(tta->data, &ptr);
>> -    avio_write(s->pb, ptr, size);
>> -    av_free(ptr);
>> +    tta_queue_flush(s);
>>  
>>      ff_ape_write_tag(s);
>>      avio_flush(s->pb);
> 
> Ping.

Patchset pushed.
diff mbox

Patch

diff --git a/libavformat/ttaenc.c b/libavformat/ttaenc.c
index fdce1e3dc1..b05705b6b6 100644
--- a/libavformat/ttaenc.c
+++ b/libavformat/ttaenc.c
@@ -29,7 +29,7 @@ 
 
 typedef struct TTAMuxContext {
     AVIOContext *seek_table;
-    AVIOContext *data;
+    AVPacketList *queue, *queue_end;
     uint32_t nb_samples;
     int frame_size;
     int last_frame;
@@ -56,10 +56,6 @@  static int tta_write_header(AVFormatContext *s)
 
     if ((ret = avio_open_dyn_buf(&tta->seek_table)) < 0)
         return ret;
-    if ((ret = avio_open_dyn_buf(&tta->data)) < 0) {
-        ffio_free_dyn_buf(&tta->seek_table);
-        return ret;
-    }
 
     /* Ignore most extradata information if present. It can be innacurate
        if for example remuxing from Matroska */
@@ -84,8 +80,23 @@  static int tta_write_header(AVFormatContext *s)
 static int tta_write_packet(AVFormatContext *s, AVPacket *pkt)
 {
     TTAMuxContext *tta = s->priv_data;
+    AVPacketList *pktl = av_mallocz(sizeof(*pktl));
+    int ret;
+
+    if (!pktl)
+        return AVERROR(ENOMEM);
+
+    ret = av_packet_ref(&pktl->pkt, pkt);
+    if (ret < 0) {
+        av_free(pktl);
+        return ret;
+    }
+    if (tta->queue_end)
+        tta->queue_end->next = pktl;
+    else
+        tta->queue = pktl;
+    tta->queue_end = pktl;
 
-    avio_write(tta->data, pkt->data, pkt->size);
     avio_wl32(tta->seek_table, pkt->size);
     tta->nb_samples += pkt->duration;
 
@@ -106,6 +117,21 @@  static int tta_write_packet(AVFormatContext *s, AVPacket *pkt)
     return 0;
 }
 
+static void tta_queue_flush(AVFormatContext *s)
+{
+    TTAMuxContext *tta = s->priv_data;
+    AVPacketList *pktl;
+
+    while (pktl = tta->queue) {
+        AVPacket *pkt = &pktl->pkt;
+        avio_write(s->pb, pkt->data, pkt->size);
+        av_packet_unref(pkt);
+        tta->queue = pktl->next;
+        av_free(pktl);
+    }
+    tta->queue_end = NULL;
+}
+
 static int tta_write_trailer(AVFormatContext *s)
 {
     TTAMuxContext *tta = s->priv_data;
@@ -125,9 +151,7 @@  static int tta_write_trailer(AVFormatContext *s)
     av_free(ptr);
 
     /* Write audio data */
-    size = avio_close_dyn_buf(tta->data, &ptr);
-    avio_write(s->pb, ptr, size);
-    av_free(ptr);
+    tta_queue_flush(s);
 
     ff_ape_write_tag(s);
     avio_flush(s->pb);