mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-28 20:53:54 +02:00
b5229a0b3e
The mov flavour of timed text uses the first two bytes of the packet as a length field. And up until11bef2fe
said length field has been read correctly in the mov2textsub bsf. But since then the next two bytes are read as if they were the length field. This is fixed in this commit. Reviewed-by: Philip Langdale <philipl@overt.org> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com> Signed-off-by: James Almer <jamrial@gmail.com> (cherry picked from commit800f618a34
)
88 lines
2.1 KiB
C
88 lines
2.1 KiB
C
/*
|
|
* Copyright (c) 2008 Reimar Döffinger
|
|
*
|
|
* This file is part of FFmpeg.
|
|
*
|
|
* FFmpeg is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* FFmpeg is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with FFmpeg; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
#include "libavutil/common.h"
|
|
#include "libavutil/intreadwrite.h"
|
|
#include "avcodec.h"
|
|
#include "bsf.h"
|
|
|
|
static int text2movsub(AVBSFContext *ctx, AVPacket *out)
|
|
{
|
|
AVPacket *in;
|
|
int ret = 0;
|
|
|
|
ret = ff_bsf_get_packet(ctx, &in);
|
|
if (ret < 0)
|
|
return ret;
|
|
|
|
if (in->size > 0xffff) {
|
|
ret = AVERROR_INVALIDDATA;
|
|
goto fail;
|
|
}
|
|
|
|
ret = av_new_packet(out, in->size + 2);
|
|
if (ret < 0) {
|
|
ret = AVERROR(ENOMEM);
|
|
goto fail;
|
|
}
|
|
|
|
ret = av_packet_copy_props(out, in);
|
|
if (ret < 0)
|
|
goto fail;
|
|
|
|
AV_WB16(out->data, in->size);
|
|
memcpy(out->data + 2, in->data, in->size);
|
|
|
|
fail:
|
|
if (ret < 0)
|
|
av_packet_unref(out);
|
|
av_packet_free(&in);
|
|
return ret;
|
|
}
|
|
|
|
const AVBitStreamFilter ff_text2movsub_bsf = {
|
|
.name = "text2movsub",
|
|
.filter = text2movsub,
|
|
};
|
|
|
|
static int mov2textsub(AVBSFContext *ctx, AVPacket *pkt)
|
|
{
|
|
int ret = 0;
|
|
|
|
ret = ff_bsf_get_packet_ref(ctx, pkt);
|
|
if (ret < 0)
|
|
return ret;
|
|
|
|
if (pkt->size < 2) {
|
|
av_packet_unref(pkt);
|
|
return AVERROR_INVALIDDATA;
|
|
}
|
|
|
|
pkt->size = FFMIN(pkt->size - 2, AV_RB16(pkt->data));
|
|
pkt->data += 2;
|
|
|
|
return 0;
|
|
}
|
|
|
|
const AVBitStreamFilter ff_mov2textsub_bsf = {
|
|
.name = "mov2textsub",
|
|
.filter = mov2textsub,
|
|
};
|