aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat/movenc.c
diff options
context:
space:
mode:
authorJames Almer <jamrial@gmail.com>2017-10-27 13:52:19 -0300
committerJames Almer <jamrial@gmail.com>2017-10-27 18:15:37 -0300
commite0250cf3651e6417e0117486a7816b45fb2d34cd (patch)
treefd04f7310c17247d93843ea177ef6f9d644296c4 /libavformat/movenc.c
parent5834cba05efbfd24dadedd187753f244ad7e0cab (diff)
parent50a1c66cf6ab7eb683daaa9e2da3869fa3a54609 (diff)
downloadffmpeg-e0250cf3651e6417e0117486a7816b45fb2d34cd.tar.gz
Merge commit '50a1c66cf6ab7eb683daaa9e2da3869fa3a54609'
* commit '50a1c66cf6ab7eb683daaa9e2da3869fa3a54609': ac3_parser: add a public function for parsing the data required by the demuxer avpriv_ac3_parse_header() is left in place but without the GetBitContext parameter, as the mov muxer requires a lot more fields than just bitstream_id and frame_size from the AC3HeaderInfo struct. Merged-by: James Almer <jamrial@gmail.com>
Diffstat (limited to 'libavformat/movenc.c')
-rw-r--r--libavformat/movenc.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index 2838286141..a34987a7dc 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -31,7 +31,7 @@
#include "avio.h"
#include "isom.h"
#include "avc.h"
-#include "libavcodec/ac3_parser.h"
+#include "libavcodec/ac3_parser_internal.h"
#include "libavcodec/dnxhddata.h"
#include "libavcodec/flac.h"
#include "libavcodec/get_bits.h"
@@ -345,7 +345,6 @@ struct eac3_info {
#if CONFIG_AC3_PARSER
static int handle_eac3(MOVMuxContext *mov, AVPacket *pkt, MOVTrack *track)
{
- GetBitContext gbc;
AC3HeaderInfo tmp, *hdr = &tmp;
struct eac3_info *info;
int num_blocks;
@@ -354,8 +353,7 @@ static int handle_eac3(MOVMuxContext *mov, AVPacket *pkt, MOVTrack *track)
return AVERROR(ENOMEM);
info = track->eac3_priv;
- init_get_bits(&gbc, pkt->data, pkt->size * 8);
- if (avpriv_ac3_parse_header(&gbc, &hdr) < 0) {
+ if (avpriv_ac3_parse_header(&hdr, pkt->data, pkt->size) < 0) {
/* drop the packets until we see a good one */
if (!track->entry) {
av_log(mov, AV_LOG_WARNING, "Dropping invalid packet from start of the stream\n");
@@ -403,16 +401,18 @@ static int handle_eac3(MOVMuxContext *mov, AVPacket *pkt, MOVTrack *track)
int parent = hdr->substreamid;
while (cumul_size != pkt->size) {
- int i;
- init_get_bits(&gbc, pkt->data + cumul_size, (pkt->size - cumul_size) * 8);
- if (avpriv_ac3_parse_header(&gbc, &hdr) < 0)
+ GetBitContext gbc;
+ int i, ret;
+ ret = avpriv_ac3_parse_header(&hdr, pkt->data + cumul_size, pkt->size - cumul_size);
+ if (ret < 0)
return AVERROR_INVALIDDATA;
if (hdr->frame_type != EAC3_FRAME_TYPE_DEPENDENT)
return AVERROR(EINVAL);
- cumul_size += hdr->frame_size;
info->substream[parent].num_dep_sub++;
+ ret /= 8;
/* header is parsed up to lfeon, but custom channel map may be needed */
+ init_get_bits8(&gbc, pkt->data + cumul_size + ret, pkt->size - cumul_size - ret);
/* skip bsid */
skip_bits(&gbc, 5);
/* skip volume control params */
@@ -427,6 +427,7 @@ static int handle_eac3(MOVMuxContext *mov, AVPacket *pkt, MOVTrack *track)
info->substream[parent].chan_loc |= (get_bits(&gbc, 16) >> 5) & 0x1f;
else
info->substream[parent].chan_loc |= hdr->channel_mode;
+ cumul_size += hdr->frame_size;
}
}
}