Mail Archives: cygwin/2026/05/28/18:58:12
| DMARC-Filter: | OpenDMARC Filter v1.4.2 delorie.com 64SMwBqa2862053
|
| Authentication-Results: | delorie.com; dmarc=pass (p=none dis=none) header.from=cygwin.com
|
| Authentication-Results: | delorie.com; spf=pass smtp.mailfrom=cygwin.com
|
| DKIM-Filter: | OpenDKIM Filter v2.11.0 delorie.com 64SMwBqa2862053
|
| Authentication-Results: | delorie.com;
|
| dkim=pass (1024-bit key, unprotected) header.d=cygwin.com header.i=@cygwin.com header.a=rsa-sha256 header.s=default header.b=Vn/J5HhQ
|
| X-Recipient: | archive-cygwin AT delorie DOT com
|
| DKIM-Filter: | OpenDKIM Filter v2.11.0 sourceware.org EE7FD4BA2E2D
|
| DKIM-Signature: | v=1; a=rsa-sha256; c=relaxed/relaxed; d=cygwin.com;
|
| s=default; t=1780009090;
|
| bh=hrWbJ58rxakrl6VEWWTBBQZlvfwop1AdGKnxv30R6U8=;
|
| h=Date:To:Subject:In-Reply-To:References:List-Id:List-Unsubscribe:
|
| List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:
|
| From;
|
| b=Vn/J5HhQFtVStYaMVWSkYupmUnTJFg4ujaTSFDedMZkrzCzWWzbYCqgF1MS9GvKd1
|
| +rVEEWrHHSCb7F7mgdfKL4yi7S9t5NJ6a9HdiFMNJIFEw7za7ImpT0dbn9Y/agpo46
|
| EWfcOzW/bxj0SQgm2NAwvnKFsT9CLMNqB0hZ9aiY=
|
| X-Original-To: | cygwin AT cygwin DOT com
|
| Delivered-To: | cygwin AT cygwin DOT com
|
| DMARC-Filter: | OpenDMARC Filter v1.4.2 sourceware.org 87A954BA2E1B
|
| ARC-Filter: | OpenARC Filter v1.0.0 sourceware.org 87A954BA2E1B
|
| ARC-Seal: | i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1780009067; cv=none;
|
| b=mgSPYlqlRf8KvKUctwNgrRU2fCAKwOxoUiAG94UtHKc8gVON9wpavNqQOdpNKfzCZXE78HPAfJC2bp8nY7DdpORp+WSU709bfSTcsmMV69v4xtX1AI5RbTVg6SGdkfO/lzHb7QIh1ghiwbSb8RSfpZLtLqjp6KkMd9DE4SDVY8Y=
|
| ARC-Message-Signature: | i=1; a=rsa-sha256; d=sourceware.org; s=key;
|
| t=1780009067; c=relaxed/simple;
|
| bh=I6k7IKEraSo8uvIuAtxPUxSyXQFeQXQT8vd1Omqk8I0=;
|
| h=Date:From:To:Subject:Message-Id:Mime-Version:DKIM-Signature;
|
| b=vbuhYbEkJigmB7dYq4jxfnR4OS7ZDmXzLJJS06i5Cy7wV0CKZRkEGPiE6LeWbSTkVYT0860mywzBBp8vRqd5cFNKzyV7vV5tgkrbH13CQu1blGRQUWKyE6LkEb5PM2wnfit21K8clu41WZbCmwGFfEm6w3350fJcZbfjPnik6bo=
|
| ARC-Authentication-Results: | i=1; sourceware.org;
|
| dkim=pass (2048-bit key, unprotected)
|
| header.d=nifty.ne.jp header.i=@nifty.ne.jp header.a=rsa-sha256
|
| header.s=default-1th84yt82rvi header.b=eePTRfcL
|
| DKIM-Filter: | OpenDKIM Filter v2.11.0 sourceware.org 87A954BA2E1B
|
| Date: | Fri, 29 May 2026 07:57:43 +0900
|
| To: | "cygwin AT cygwin DOT com" <cygwin AT cygwin DOT com>
|
| Subject: | Re: "Invalid DTS" warnings only in Cygwin version of ffmpeg
|
| Message-Id: | <20260529075743.9c2466366921f6171f280ef9@nifty.ne.jp>
|
| In-Reply-To: | <PR3PR09MB433011445CBFA2C376E5ECACB0082@PR3PR09MB4330.eurprd09.prod.outlook.com>
|
| References: | <PR3PR09MB433011445CBFA2C376E5ECACB0082 AT PR3PR09MB4330 DOT eurprd09 DOT prod DOT outlook DOT com>
|
| X-Mailer: | Sylpheed 3.7.0 (GTK+ 2.24.30; i686-pc-mingw32)
|
| Mime-Version: | 1.0
|
| X-BeenThere: | cygwin AT cygwin DOT com
|
| X-Mailman-Version: | 2.1.30
|
| List-Id: | General Cygwin discussions and problem reports <cygwin.cygwin.com>
|
| List-Unsubscribe: | <https://cygwin.com/mailman/options/cygwin>,
|
| <mailto:cygwin-request AT cygwin DOT com?subject=unsubscribe>
|
| List-Archive: | <https://cygwin.com/pipermail/cygwin/>
|
| List-Post: | <mailto:cygwin AT cygwin DOT com>
|
| List-Help: | <mailto:cygwin-request AT cygwin DOT com?subject=help>
|
| List-Subscribe: | <https://cygwin.com/mailman/listinfo/cygwin>,
|
| <mailto:cygwin-request AT cygwin DOT com?subject=subscribe>
|
| From: | Takashi Yano via Cygwin <cygwin AT cygwin DOT com>
|
| Reply-To: | Takashi Yano <takashi DOT yano AT nifty DOT ne DOT jp>
|
| Errors-To: | cygwin-bounces~archive-cygwin=delorie DOT com AT cygwin DOT com
|
| Sender: | "Cygwin" <cygwin-bounces~archive-cygwin=delorie DOT com AT cygwin DOT com>
|
This is a multi-part message in MIME format.
--Multipart=_Fri__29_May_2026_07_57_43_+0900_E78XSD=eOhsy1bz8
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
Hi destal,
On Wed, 27 May 2026 06:20:36 +0000
destal takul wrote:
> Thank you for the clarification. Is there any way to fix the files that were remuxed with those warnings, or do I have to remux from the original? I have been using the Cygwin version of ffmpeg to cut the end of videos muxed with mkvmerge on non-key-frames since mkvmerge itself doesn't support this, and I probably have hundreds of files that have been remuxed with such warnings over the course of the past few years.
Sorry for inconvinience.
Could you please try attached tool? This should fix the broken
timestamp.
Usage: fix_ts broken.mkv output.mkv
To compile this, you need libavformat-devel, libavcodec-devel,
and libavutil-deve packages.
--
Takashi Yano <takashi DOT yano AT nifty DOT ne DOT jp>
--Multipart=_Fri__29_May_2026_07_57_43_+0900_E78XSD=eOhsy1bz8
Content-Type: text/x-csrc;
name="fix_ts.c"
Content-Disposition: attachment;
filename="fix_ts.c"
Content-Transfer-Encoding: 7bit
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
int index;
int display_rank;
} FrameMap;
static int cmp_frame(const void *a, const void *b) {
return ((FrameMap*)a)->display_rank - ((FrameMap*)b)->display_rank;
}
#define MAX_REORDER_DELAY 16
void cleanup(AVFormatContext *ifmt, AVFormatContext *ofmt,
AVCodecParserContext *parser, AVCodecContext *codec_ctx,
FrameMap *map, FrameMap *sorted) {
if (parser) av_parser_close(parser);
if (codec_ctx) avcodec_free_context(&codec_ctx);
if (ifmt) avformat_close_input(&ifmt);
if (ofmt) {
if (!(ofmt->oformat->flags & AVFMT_NOFILE)) avio_closep(&ofmt->pb);
avformat_free_context(ofmt);
}
if (map) free(map);
if (sorted) free(sorted);
}
int main(int argc, char **argv) {
int ret = 1;
if (argc < 3) {
fprintf(stderr, "Usage: %s in.mkv out.mkv\n", argv[0]);
return 1;
}
AVFormatContext *ifmt = NULL, *ofmt = NULL;
AVCodecParserContext *parser = NULL;
AVCodecContext *codec_ctx = NULL;
FrameMap *map = NULL, *sorted = NULL;
int frame_count = 0, frame_cap = 10000;
if (avformat_open_input(&ifmt, argv[1], NULL, NULL) < 0) {
fprintf(stderr, "avformat_open_input() failed.\n");
goto end;
}
if (avformat_find_stream_info(ifmt, NULL) < 0) {
fprintf(stderr, "avformat_find_stream_info() failed.\n");
goto end;
}
int video_index = -1;
for (unsigned i = 0; i < ifmt->nb_streams; i++)
if (ifmt->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
video_index = i;
parser = av_parser_init(AV_CODEC_ID_H264);
codec_ctx = avcodec_alloc_context3(NULL);
avcodec_parameters_to_context(codec_ctx,
ifmt->streams[video_index]->codecpar);
map = malloc(frame_cap * sizeof(FrameMap));
AVPacket pkt;
uint64_t pict_num_msb = 0;
int prev_pict_num = -1;
while (av_read_frame(ifmt, &pkt) >= 0) {
if (pkt.stream_index == video_index) {
if (frame_count >= frame_cap) {
frame_cap *= 2;
map = realloc(map, frame_cap * sizeof(FrameMap));
}
uint8_t *data; int size;
av_parser_parse2(parser, codec_ctx, &data, &size,
pkt.data, pkt.size, AV_NOPTS_VALUE, AV_NOPTS_VALUE, 0);
if (prev_pict_num >= 0 &&
parser->output_picture_number - prev_pict_num
< -MAX_REORDER_DELAY)
pict_num_msb++;
map[frame_count] =
(FrameMap){frame_count, parser->output_picture_number
+ (int)(pict_num_msb * 1024)};
prev_pict_num = parser->output_picture_number;
frame_count++;
}
av_packet_unref(&pkt);
}
sorted = malloc(frame_count * sizeof(FrameMap));
memcpy(sorted, map, frame_count * sizeof(FrameMap));
qsort(sorted, frame_count, sizeof(FrameMap), cmp_frame);
for (int i = 0; i < frame_count; i++)
map[sorted[i].index].display_rank = i;
if (avformat_alloc_output_context2(&ofmt, NULL, NULL, argv[2]) != 0) {
fprintf(stderr, "avformat_alloc_output_context2() failed.\n");
goto end;
}
for (unsigned i = 0; i < ifmt->nb_streams; i++) {
AVStream *out_st = avformat_new_stream(ofmt, NULL);
avcodec_parameters_copy(out_st->codecpar, ifmt->streams[i]->codecpar);
}
AVStream *in_st = ifmt->streams[video_index];
if (!(ofmt->oformat->flags & AVFMT_NOFILE))
avio_open(&ofmt->pb, argv[2], AVIO_FLAG_WRITE);
if (avformat_write_header(ofmt, NULL) < 0) {
fprintf(stderr, "avformat_write_header() failed.\n");
goto end;
}
AVRational out_tb = ofmt->streams[video_index]->time_base;
AVRational frame_rate = in_st->avg_frame_rate;
if (frame_rate.num == 0)
frame_rate = in_st->r_frame_rate;
av_seek_frame(ifmt, video_index, 0, AVSEEK_FLAG_BACKWARD);
int current = 0;
while (av_read_frame(ifmt, &pkt) >= 0) {
if (pkt.stream_index == video_index) {
pkt.pts = av_rescale_q(map[current].display_rank,
av_inv_q(frame_rate), out_tb);
pkt.dts = av_rescale_q(current - MAX_REORDER_DELAY,
av_inv_q(frame_rate), out_tb);
pkt.duration = av_rescale_q(1, av_inv_q(frame_rate), out_tb);
current++;
}
if (ifmt->streams[pkt.stream_index]->codecpar->codec_type
== AVMEDIA_TYPE_AUDIO)
av_packet_rescale_ts(&pkt,
ifmt->streams[pkt.stream_index]->time_base,
ofmt->streams[pkt.stream_index]->time_base);
av_interleaved_write_frame(ofmt, &pkt);
av_packet_unref(&pkt);
}
av_write_trailer(ofmt);
ret = 0;
end:
cleanup(ifmt, ofmt, parser, codec_ctx, map, sorted);
return ret;
}
--Multipart=_Fri__29_May_2026_07_57_43_+0900_E78XSD=eOhsy1bz8
Content-Type: text/plain;
name="Makefile"
Content-Disposition: attachment;
filename="Makefile"
Content-Transfer-Encoding: base64
Zml4X3RzOiBmaXhfdHMuYw0KCSQoQ0MpICQ8IC1vICRAIC1sYXZmb3JtYXQgLWxhdmNvZGVjIC1s
YXZ1dGlsDQoNCmNsZWFuOg0KCSQoUk0pIGZpeF90cw0K
--Multipart=_Fri__29_May_2026_07_57_43_+0900_E78XSD=eOhsy1bz8
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
--
Problem reports: https://cygwin.com/problems.html
FAQ: https://cygwin.com/faq/
Documentation: https://cygwin.com/docs.html
Unsubscribe info: https://cygwin.com/ml/#unsubscribe-simple
--Multipart=_Fri__29_May_2026_07_57_43_+0900_E78XSD=eOhsy1bz8--
- Raw text -