You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	ASS/SSA muxer.
Originally committed as revision 15430 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
		| @@ -22,6 +22,7 @@ OBJS-$(CONFIG_ASF_DEMUXER)               += asf.o asfcrypt.o riff.o | ||||
| OBJS-$(CONFIG_ASF_MUXER)                 += asf-enc.o riff.o | ||||
| OBJS-$(CONFIG_ASF_STREAM_MUXER)          += asf-enc.o riff.o | ||||
| OBJS-$(CONFIG_ASS_DEMUXER)               += assdec.o | ||||
| OBJS-$(CONFIG_ASS_MUXER)                 += assenc.o | ||||
| OBJS-$(CONFIG_AU_DEMUXER)                += au.o raw.o | ||||
| OBJS-$(CONFIG_AU_MUXER)                  += au.o | ||||
| OBJS-$(CONFIG_AVI_DEMUXER)               += avidec.o riff.o | ||||
|   | ||||
| @@ -59,7 +59,7 @@ void av_register_all(void) | ||||
|     REGISTER_DEMUXER  (APC, apc); | ||||
|     REGISTER_DEMUXER  (APE, ape); | ||||
|     REGISTER_MUXDEMUX (ASF, asf); | ||||
|     REGISTER_DEMUXER  (ASS, ass); | ||||
|     REGISTER_MUXDEMUX (ASS, ass); | ||||
|     REGISTER_MUXER    (ASF_STREAM, asf_stream); | ||||
|     REGISTER_MUXDEMUX (AU, au); | ||||
|     REGISTER_MUXDEMUX (AVI, avi); | ||||
|   | ||||
							
								
								
									
										92
									
								
								libavformat/assenc.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								libavformat/assenc.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,92 @@ | ||||
| /* | ||||
|  * SSA/ASS muxer | ||||
|  * Copyright (c) 2008 Michael Niedermayer | ||||
|  * | ||||
|  * 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 "avformat.h" | ||||
|  | ||||
| typedef struct ASSContext{ | ||||
|     unsigned int extra_index; | ||||
| }ASSContext; | ||||
|  | ||||
| static int write_header(AVFormatContext *s) | ||||
| { | ||||
|     ASSContext *ass = s->priv_data; | ||||
|     AVCodecContext *avctx= s->streams[0]->codec; | ||||
|     uint8_t *last= NULL; | ||||
|  | ||||
|     if(s->nb_streams != 1 || avctx->codec_id != CODEC_ID_SSA){ | ||||
|         av_log(s, AV_LOG_ERROR, "Exactly one ASS/SSA stream is needed.\n"); | ||||
|         return -1; | ||||
|     } | ||||
|  | ||||
|     while(ass->extra_index < avctx->extradata_size){ | ||||
|         uint8_t *p  = avctx->extradata + ass->extra_index; | ||||
|         uint8_t *end= strchr(p, '\n'); | ||||
|         if(!end) end= avctx->extradata + avctx->extradata_size; | ||||
|         else     end++; | ||||
|  | ||||
|         put_buffer(s->pb, p, end-p); | ||||
|         ass->extra_index += end-p; | ||||
|  | ||||
|         if(last && !memcmp(last, "[Events]", 8)) | ||||
|             break; | ||||
|         last=p; | ||||
|     } | ||||
|  | ||||
|     put_flush_packet(s->pb); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static int write_packet(AVFormatContext *s, AVPacket *pkt) | ||||
| { | ||||
|     put_buffer(s->pb, pkt->data, pkt->size); | ||||
|  | ||||
|     put_flush_packet(s->pb); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static int write_trailer(AVFormatContext *s) | ||||
| { | ||||
|     ASSContext *ass = s->priv_data; | ||||
|     AVCodecContext *avctx= s->streams[0]->codec; | ||||
|  | ||||
|     put_buffer(s->pb, avctx->extradata      + ass->extra_index, | ||||
|                       avctx->extradata_size - ass->extra_index); | ||||
|  | ||||
|     put_flush_packet(s->pb); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| AVOutputFormat ass_muxer = { | ||||
|     "ass", | ||||
|     NULL_IF_CONFIG_SMALL("SSA/ASS format"), | ||||
|     NULL, | ||||
|     "ass,ssa", | ||||
|     sizeof(ASSContext), | ||||
|     CODEC_ID_NONE, | ||||
|     CODEC_ID_NONE, | ||||
|     write_header, | ||||
|     write_packet, | ||||
|     write_trailer, | ||||
|     .flags = AVFMT_GLOBALHEADER | AVFMT_NOTIMESTAMPS | ||||
| }; | ||||
		Reference in New Issue
	
	Block a user