Adding support for end trimming Opus embedded in Ogg container. Signed-Off By: Vignesh Venkatasubramanian <vigneshv@google.com> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>tags/n2.1
| @@ -30,6 +30,7 @@ | |||||
| #include <stdio.h> | #include <stdio.h> | ||||
| #include "libavutil/avassert.h" | #include "libavutil/avassert.h" | ||||
| #include "libavutil/intreadwrite.h" | |||||
| #include "oggdec.h" | #include "oggdec.h" | ||||
| #include "avformat.h" | #include "avformat.h" | ||||
| #include "internal.h" | #include "internal.h" | ||||
| @@ -773,6 +774,18 @@ retry: | |||||
| pkt->duration = os->pduration; | pkt->duration = os->pduration; | ||||
| pkt->pos = fpos; | pkt->pos = fpos; | ||||
| if (os->end_trimming) { | |||||
| uint8_t *side_data = av_packet_new_side_data(pkt, | |||||
| AV_PKT_DATA_SKIP_SAMPLES, | |||||
| 10); | |||||
| if(side_data == NULL) { | |||||
| av_free_packet(pkt); | |||||
| av_free(pkt); | |||||
| return AVERROR(ENOMEM); | |||||
| } | |||||
| AV_WL32(side_data + 4, os->end_trimming); | |||||
| } | |||||
| return psize; | return psize; | ||||
| } | } | ||||
| @@ -84,6 +84,7 @@ struct ogg_stream { | |||||
| int got_start; | int got_start; | ||||
| int got_data; ///< 1 if the stream got some data (non-initial packets), 0 otherwise | int got_data; ///< 1 if the stream got some data (non-initial packets), 0 otherwise | ||||
| int nb_header; ///< set to the number of parsed headers | int nb_header; ///< set to the number of parsed headers | ||||
| int end_trimming; ///< set the number of packets to drop from the end | |||||
| void *private; | void *private; | ||||
| }; | }; | ||||
| @@ -118,6 +118,7 @@ static int opus_packet(AVFormatContext *avf, int idx) | |||||
| skip = FFMIN(skip, os->pduration); | skip = FFMIN(skip, os->pduration); | ||||
| if (skip > 0) { | if (skip > 0) { | ||||
| os->pduration = skip < os->pduration ? os->pduration - skip : 1; | os->pduration = skip < os->pduration ? os->pduration - skip : 1; | ||||
| os->end_trimming = skip; | |||||
| av_log(avf, AV_LOG_WARNING, | av_log(avf, AV_LOG_WARNING, | ||||
| "Last packet must be truncated to %d (unimplemented).\n", | "Last packet must be truncated to %d (unimplemented).\n", | ||||
| os->pduration); | os->pduration); | ||||